Linux上层应用-->Shell scripts基础规范
Shell scripts 的基本格式:
1、文件开头加入shell类型指定: #!/bin/bash
2、注释使用'#',仅支持单行注释
3、语句结尾没有分号
4、参数及命令多用空格分隔
Shell scripts 中可以取得的默认特殊变量:
${0}:当前运行脚本的文件名
${n}:n为数字大于或等于1,代表当前脚本输入的第n个参数的内容。
${#}:传递给脚本或函数的参数个数。
${*}:传递给脚本或函数所有参数的集,当被双引号包含时(也就是“${*}”),参数集输出会是一个整体(也就是"${1} ${2}...")。
${@}:传递给脚本或函数所有参数的集,双引号包含还是不包含输出结果一样。
${?}:上一个命令执行后的输出状态,返回0表示执行成功,否则失败。
${$}:当前运行脚本进程ID。
变量的替换原则:
${val:-new}:若变量不存在,返回new且不改变val
${val:=new}:若变量不存在,返回new且改变val
${val:?new}:若变量不存在,返回new到stderr且不改变val
${val:+new}:若变量不存在,创建val。否则返回new
运算符:
算术运算符
算术运算使用格式$((运算内容)),比如:$((${a}+${b}))
注意:上面的运算格式,仅仅支持整数运算,浮点运算需要通过bc、awk等工具实现!
目前支持的算术运算符如下(与c/c++运算符一样):
+:加法
-:减法
*:乘法
/:除法
%:取余
=:赋值
关系运算符
注意:
1、关系运算符也仅仅支持整数运算
2、[]与其中的组件都需要有空格分隔,如[ "a" == "b" ]
3、组件必须用双引号包含!如[ "${a}" == "b" ]
目前支持的关系运算符如下(满足关系返回true,否则会false):
==:相等
!=:不相等
-eq:(equal)相等
-ne:(not equal)不相等
-gt:(greater than)左值是否大于右值
-lt:(less than)左值是否小于右值
-ge:(greater than or equal)左值是否大于或等于右值
-ls:(less than or equal)左值是否小于或等于右值
布尔运算:
!:非运算,逻辑结果取反
-a:(and)与运算,两个表达式都为真才返回true
-o:(or)或运算,两个表达式其中一个为真就返回true
字符串运算符:
=:是否相等
!=:是否不等
-z:(zreo)是否为空
-n:是否不为空
文件测试运算符:
-e:文件是否存在
-f:是否为普通档案
-d:是否为目录
-b:是否为块设置
-c:是否为字符设备
-S:是否为Socket文件
-p:是否为管道(FIFO)文件
-L:是否为链接
-r:是否有读权限
-w:是否有写权限
-x:是否有执行权限
-u:是否有SUID属性
-g:是否有SGID属性
-k:是否有粘着位(Sticky bit)
-s:是否存在且为非空档案
-nt:(newer than)左边档案是否比右边档案新
-ot:(older than)左边档案是否比右边档案旧
-ef:左右是否为同一档案,在判断硬链接比较有用
字符串:
获取字符串长度: echo ${#val} (在val前面加#)
提取字符串: echo ${val:n:m}(提取字符串n到m之间的字符串,以0开始)
数组:
注意:目前Shell仅仅支持一维数组,也是从下标0开始
定义数组:val=(val0 val1 val2...) (用空格隔开元素)
单独改变: val[n]=val0
读取元素:valn=${val[n]} (若不带下标,默认是0号元素,使用@或*获取全部元素)
printf:
printf用法与c/c++类似,但是格式不一样:
printf format-string [arguments...]
format-string->使用双引号,与C一样
arguments->参数之间用空格做分隔
if else :
与c/c++逻辑类似,格式略不同:
if [ expression ] (注意[]中的空格分离) then ...... fi if [ expression ] (注意[]中的空格分离) then ...... else ...... fi if [ expression ] (注意[]中的空格分离) then ...... elif [ expression ] (注意[]中的空格分离) then ...... else ...... fi
case ...esac :
与c/c++逻辑一样,根据val值匹配val1..valn,若无匹配则跳转到*选项,每个选项以;;结尾。
当多个选项输出同一结果时,用'|'组合。
1 case val in 2 3 val1) 4 5 ;; 6 7 val2) 8 9 ;; 10 11 *) 12 13 ;; 14 15 esac
for循环:
1 for 变量 in 列表 2 do 3 command1 4 command2 5 ... 6 commandN 7 done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。
注意:列表可以使用通配符等技巧,实现多种参数输入
while循环:
1 while command 2 do 3 4 .... 5 6 done
当command执行命令为真,就执行do中内容
until循环:
until循环逻辑与while相反,command为假就执行内容
1 until command 2 3 do 4 5 ...... 6 7 done
跳出循环:
break后可以接数字,代表跳出到第几层循环。若不接数字,默认跳出到最大循环。若数字大于最大循环,则跳出最大循环。
continue代表直接进入下一次循环,和c/c++一样。
函数:
1 FunctionName() 2 { 3 ......... 4 }
注意:
1、函数名括号中不能带有参数。
2、函数也有返回值,同样通过${?}取得
3、调用函数直接输入函数名,但后面不能跟括号
4、函数参数在函数名后输入,空格分隔各参数,${n}取第n个参数,从1开始
文件调用:
bash也可以包含其他shell文件,使用格式:
source File
或
. File(注意空格)
shell scripts 调试:
使用sh [-nvx] file.sh命令调试脚本
-n:不执行scripts,仅检查语法
-v:先将scripts内容输出到屏幕上,再执行
-x:将scripts执行过程中使用到的内容都输出到屏幕上
posted on 2016-04-06 23:15 KcMeterCEC 阅读(353) 评论(0) 编辑 收藏 举报