shell 脚本编程概述

  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=”1232 
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 进制的数字,也就是十进制的 22246 
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 支持简单的声明(变量赋值、中断、返回等)、复合语句(ifwhilefor 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 来决定退出码,为了避免问题,要在函数一结束就取状态码,状态码要在 0255 之间。
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 读取文件

 

posted @ 2015-03-18 17:30  little-snake  阅读(224)  评论(0编辑  收藏  举报