1 环境变量
2
3
4 ? 退出状态码 0(成功) 1(未知错误) 2(误用 shell 命令) 126(命令不可执行) 127(没找到命令) 128(无效退出状态) 128+x( linux 信号 X 的严重错误) 130( ctrl c 终止程序 ) 255(退出状态码越界)
5 # 命令行参数个数
6 @ 以“参数1”“参数2”...形式保存所有参数
7 * 以“参数1 参数2...”形式保存所有参数
8 $ 本程序的 PID
9 ! 上一个命令的 PID
10 0 当前程序文件名
11 n 命令行参数,第 n 个参数,$0 表示文件名
12 LANG 当前语言环境,zh_CN.utf8
13 SHELL 当前的命令解释器
14 PATH 命令搜索路径,以冒号为分隔符,注意与DOS下不同的是,当前目录不在系统路径里
15 HOME 用户home目录的路径名,是cd命令的默认参数
16 COLUMNS 命令编辑模式下可使用的命令行的长度
17 EDITOR 默认的行编辑器
18 VISUAL 默认的可视编辑器
19 FCEDIT 命令fc使用的编辑器
20 HISTFILE 命令历史文件
21 HISTSIZE 命令历史文件中最多可包含的命令条数
22 IFS 定义 shell 使用的分隔符,指定了在命令行中用来分隔参数的字符,其默认值为空格,制表符和换行符。但无论IFS的值是什么,用户总是可以使用空格符和制表符来分隔参数;
23 LOGNAME 用户登录名
24 MAIL 保存邮件的位置
25 MAILCHECK shell检查MAIL文件的周期,单位是秒
26 MAILPATH 功能与MAIL类似,但可以是一组文件,以冒号分隔
27 RANDOM 小于等与 5 位数的随机数
28 SHELL shell的路径名
29 TERM 终端的类型
30 TMOUT shell自动退出的时间,若为0则禁止shell自动退出
31 PS1 主命令提示符
32 PS2 二级命令提示符,命令执行过程中要求输入数据时用
33 PS3 select的命令提示符
34 PS4 调试命令提示符
35 MANPATH 寻找手册页的路径,以冒号分隔
36 LD_LIBRARY_PATH 寻找库的路径,以冒号分隔
37
38
39 自定义环境变量不能以数字开头,文件路径不用使用转义字符。
40 export 导出全局变量
41
42
43
44 Bash 执行命令的优先级:
45 别名 关键字 函数 内建命令 脚本或可执行程序($PATH)
46
47
48
49 shell 基本语法:
50
51
52 关键字(由 bash 解释):if elif else (for in) then test until while case break continue echo clear let read
53
54
55 if then...elif then......fi( if then...else...fi )
56 while [condition] do...done
57 for value in "hel" "hello" "world"...do...done
58 case $value in...a)...;;b)...;;esac
59
60
61 if-then 高级特性
62
63 双尖括号 (())
64 双方括号 [[]]
65
66
67 if [$region –eq “1”]
68 then
69 echo “Hello, Bob”
70 elif [$region –eq “2”]
71 then
72 echo “hello, Mary”
73 elif [$region –eq “3”]
74 then
75 echo “hello, Joan”
76 elif [$region –eq “4”]
77 then
78 echo “hello, Mike”
79 elif [$region –eq “5”]
80 then
81 echo “hello, Tom”
82 fi
83
84 let flag=1
85 while [“$flah” –lt 4]
86 do
87 for friend in Bob Mary Sue
88 do
89 echo “hello, $friend”
90 done
91 let flag=”$flag + 1”
92 done
93
94 for friend in “Mary” “Joe” “Sue”
95 do
96 echo “hello, $friend”
97 done
98
99 for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do [ -f $CPUFREQ ] || continue; echo -n performance > $CPUFREQ; done
100
101 case $region in
102 1)
103 echo “Hello, Bob”
104 ;;
105 2)
106 echo “Hello, Mary”
107 ;;
108 3)
109 echo “Hello, Joan”
110 ;;
111 4)
112 echo “Hello, Mike”
113 ;;
114 *)
115 echo “Hello, Tom”
116 ;;
117 esac
118
119
120
121 内建命令
122
123 bash
124 : . [
125 alias
126 bg bind break builtin
127 caller cd command compgen complete compopt continue
128 declare dirs disown
129 echo enable eval exec exit export
130 false fc fg
131 getopts
132 hash help history
133 jobs
134 kill
135 let local logout
136 mapfile
137 popd printf pushd pwd
138 read readonly return
139 set shift shopt source suspend
140 test times trap true type typeset
141 ulimit umask unalias unset
142 wait
143
144 dirs 显示目录栈
145 history HISTSIZE 会话期间保存的历史命令的条数,HISTFILESIZE 会话之间保存的历史命令的条数,HISTFILE 历史文件的位置
146 source 从文件中读取命令并执行,不管文件是否是脚本文件
147 type [cmd] 给出 cmd 的完整路径;-a 鉴别参数是关键字还是内建命令,也可用来定位同名的系统命令
148 unset 删除用户变量
149
150 http://www.cnblogs.com/fly-xiang-zhao/p/3708944.html
151
152
153
154 || &&
155 逻辑与 逻辑或
156
157 | &
158 管道 后台运行程序
159
160 ;
161 分隔命令,界限符
162
163 \
164 继续上一行的命令
165
166 $()
167 count=$(ls | wc -l) 执行命令,将一个命令的执行结果赋给一个变量
168
169 (())
170 ((l=$m+$n)) 数学运算,结果是5,()中要求必须包含=号
171
172 $(())
173 l=$(($m+$n)) 数学运算,结果是5,要求()中不包含=号
174
175 $[]
176 line=$[$line+1] 数学运算
177
178 []
179 test conditon( [condition] ): [ ] 是一个命令,和比较内容要用空格隔开,多个比较条件使用多个 test 语句( [ $a = "a" ] &&/|| [ $b = "b" ]
180
181
182
183 数字比较
184 -eq ne gt ge lt le;
185 bash shell 仅能处理整数;浮点数可以正常的输出,但是不能在基于数字的函数中工作。
186
187
188 字符串比较
189
190 > < = != -n -z(使用 > < 符号时要转义,如 \>,不然会被当作重定向符;且 test 和 sort 排序的规则不同,test 使用标准 ASCII 顺序,sort 使用系统本地化语言设置中定义的顺序,在 test 中大写字母小与小写字母;sort 则大写字母大于小写字母,排序是是从小到大)
191
192 -n 字符串长度不为 0 执行
193 -z 字符串长度为 0 执行
194
195
196 文件比较
197
198 -d 存在且是目录
199 -e 是否存在
200 -f 存在且是文件
201 -r 存在且可读
202 -s 存在且非空
203 -w 存在且可写
204 -x 存在且可执行
205 -O 存在且属于当前用户
206 -G 存在且默认组与当前用户相同
207 file1 -nt file2 file1 比 file2 新
208 file1 -ot file2 file1 比 file2 旧
209
210
211
212 算术运算:expr delcare let bc(scale)
213
214 expr
215 通过给定的操作(参数必须以空格分开)连接参数, 并对参数求值. 可以使算术操作, 比较操作, 字符串操作或者是逻辑操作.在算术表达式expr中使用乘法操作时, 乘法符号必须被转义:expr 5 \* 3. y=`expr $y + 1`与let y=y+1和y=$(($y+1))的效果相同.
216 expr `expr 3 + 4` \* 5 运算符号和参数之间要有空格分开,*要转义或者 4 “*” 5;s = `expr 3 + 4`; $s = `expr $s \* 5`;在shell中需要使用反引号来取得值。
217 s= $[3 + 4]
218
219
220 let 命令将执行变量的算术操作. 在许多情况下, 它被看作是复杂的expr命令的一个简化版本。
221 let a=a+5 等价于 let "a = a + 5" ;
222 let "a -= 5" # 等价于 let "a = a - 5" 双引号和空格更具可读性
223 let s= (3+4)*5 ( out of style )
224 let "z += 3" 使用引用的形式, 允许在变量赋值的时候存在空格
225
226 使用后置引用的算术扩展(常和expr一起使用):z=`expr $z + 3`。
227 使用双括号形式的算术扩展, 也可以使用 let 命令:后置引用形式的算术扩展已经被双括号形式所替代了 -- ((...))和$((...))
228 z=$(($z+3))或 z=$((z+3)),(( n += 1 )),l
229
230
231 declare raining=”1”
232
233
234 bc
235
236 echo "obase=16; ibase=2; 11101101101100010" | bc
237 echo "scale=4; 10/3" | bc
238
239 GNU bc支持高精度数字和多种数值类型(例如二进制、十进制、十六进制)的输入输出。
240 支持的操作符包括算术运算符(+, -, *, /, %, ++, --,^)、比较运算符(<, >, ==, !=, <=, >=)、逻辑运算符(!, &&, ||)、位运算符(&, |, , ~, <<, >>)和复合赋值运算符(+=, -=, *=, /=, %=, &=, |=, =, &&=, ||=, <<=, >>=)。bc内置了很多有用的函数,像是平方根、正弦、余弦、反正弦、自然对数、指数等。
241
242 scale=3
243
244 obase=16
245 ibase=16 输入和输出的数系基分别存储在 ibase 和 obase 变量中,默认值为10,有效的数值是2到16(或者环境变量BCBASEMAX的值), obase=16 放到了 ibase=16 前面,反过来则是不可以的。这个是因为如果我先输入 ibase=16,那么随后输入的 obase=16 中的 16 会被认为是 16 进制的数字,也就是十进制的 22。
246
247 history 历史命令,默认 -1,没有限制
248
249 sqrt(x) 外部的数学函数库来提供许多高级的数学函数,可以在命令行界面使用“-l”选项来打开 bc
250
251 s(x) sin
252
253 c(x) cos
254
255 a(x) 反正弦
256
257 l(x) 自然对数
258
259 e(x) 指数对数
260
261 作为一个计算语言,GNU bc 支持简单的声明(变量赋值、中断、返回等)、复合语句(if、while、for loop等)和自定义函数。
262 下面是一个简单的函数示例:
263 define dummy(x){
264 return(x * x);
265 }
266 dummy(9)
267 81
268 dummy(4)
269 16
270
271 quit
272
273
274
275 declare和typeset:为变量赋予属性
276
277 这两个命令是同一个命令的两个名字,可用设置shell变量的属性和值,属性列表如下
278
279 -a 声明一个数组变量(array)
280
281 -f 声明一个函数变量(function)
282
283 -i 声明一个整形变量(integer)
284
285 -r 声明一个只读变量(readonly)
286
287 -x 声明一个全局变量(export)
288
289
290
291 文件重定向
292
293
294 使用文件描述符语法形如“ &2 ”;
295 使用“ >> ”往文件中写数据时如果是空文件,那么这个符号没有作用。
296
297 exec 1>outputfile 将标准输出重定向到文件
298 exec 0<inputfile 从文件中获取输入
299
300 exec 3>owndefine
301 echo hello >&3 自定义文件描述符
302
303 exec 3>>appendfile 追加文件
304
305 exec 3>&1
306 exec 1>tmpfile
307 exec 1>&3
308
309 exec 6<&0
310 exec 0<tmpfile
311 exec 0<&6
312
313 exec 3>&- 关闭文件描述符
314
315
316 读写文件描述符
317
318 exec 3<>file
319 read line <&3
320 echo $line >&3
321
322
323
324 捕捉信号
325
326 trap "echo 'bye'; exit" SIGINT SIGTERM
327
328
329
330 函数
331
332 function name{}
333 name() # 调用函数使用“ name ”,单独一行
334 {
335 echo "hello, I'm Michael. this is a function! how to exclude a function? it's same as a command( no '$' )."
336 }
337 name() # 带参数的函数使用方法“ name $value 10 ”,必须在一行,而且它不能直接从脚本的命令行获取参数哦,函数自身相当于一个脚本中的脚本啦
338 {
339 if [ $# -eq 2 ]
340 then
341 echo $[ $1 + $2 ]
342 fi
343 }
344
345 函数定义必须在使用前面。
346 函数名必须是唯一的,新定义的函数会覆盖前面的函数。
347 默认情况下函数的退出码是最后一条命令的状态码,可以使用 return num 来决定退出码,为了避免问题,要在函数一结束就取状态码,状态码要在 0~255 之间。
348 脚本中定义的变量默认都是全局变量,如果函数想使用局部变量必须在声明变量时使用 local 前缀。
349
350
351
352 正则表达式
353
354
355 BRE 模式
356 \ . ^ $ * []
357
358 \ 转义字符
359 ^ 锚字符,锁定行首;不在行首出现时就是排除字符“ [^s] ”
360 $ 锚字符,锁定行末
361 . 必须匹配单字符
362 * 前面的字符出现0次或多次。u*表明u可能没有出现,也可能出现多次。.*表明这里出现多个字符或没有字符
363 [] 字符组 [hel],必须匹配单字符。[^hel] 反转字符,[hell]*匹配多次;[0-9],[a-ch-m]
364
365 特殊字符组
366 [[:alpha:]] 匹配任意字母字符
367 [[:alnum:]] 匹配任意字母数字
368 [[:blank:]] 匹配空格或制表符
369 [[:digit:]] 匹配0~9之间的数字
370 [[:lower:]] 匹配小写字母
371 [[:print:]] 匹配任意可打印字符
372 [[:punct:]] 匹配标点符号
373 [[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT、CR
374 [[:upper:]] 匹配任意大写字母
375
376
377 扩展正则表达式
378 ? + {} | ()
379 ? 前面的字符出现0次或1次
380 + 前面的字符出现1次或多次
381 {} 区间,{1,3},前面的字符出现1次到3次
382 | 管道,逻辑或的方式判断要用的多个模式
383 () 聚合符合;Sar(urday)? 匹配 Sar 或 Sarurday
384
385
386 应用
387
388 ^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.(a-zA-Z]{2,5})$ 匹配邮箱地址,用户名可由字母数字、点号、加号、破折号、下划线组成,服务器名和域名可由字母数字、点号、下划线组成,顶级域名只能是字母(不少于两个,不多于五个)
389
390
391
392 examples
393
394
395 SCRIPT=$(readlink -f $0);BASEDIR=$(dirname $SCRIPT); echo $BASEDIR 获取执行命令的值( "$0" is same )
396
397 cat <<EOF
398 if [ -f \${config_directory}/custom.cfg ]; then
399 source \${config_directory}/custom.cfg
400 elif [ -z "\${config_directory}" -a -f \$prefix/custom.cfg ]; then
401 source \$prefix/custom.cfg;
402 fi
403 EOF
404
405
406
407 问题
408
409
410 shell执行后不会改变当前工作的目录。常用 shell 解释器有 sh, bash, csh, zsh。
411
412 ${value} 有时候为了避免变量名和别的字符相混淆,最好养成习惯把变量名用“ {} ”括起来
413
414 $readonly name=minmin 只读变量
415
416 变量赋值时等号两边不能有空格。
417
418
419
420 参考
421
422
423 Linux Command Line and Shell Scripting Bible Richard Blum Christine Bresnahan
424 http://laoxu.blog.51cto.com/4120547/1273840 shell 读取文件