shell脚本语法
1 expr 数值运算工具注 : 给变量赋值时‘=’号前后没有空格;当进行运算时运算符前后有空格,变量引用前面加$符号
expr1 \* 3 使用*要加转义符,除不需要转义。
注意图二使用的是反引号 ` 而不是单引号 '
2 运行方式的差异
(2.sh脚本)
注 (. 2.sh )与(source 2.sh)作用相同。
产生上图原因:(sh 2.sh)与(./2.sh)执行命令会产生子进程,脚本执行在子进程中执行,变量为局部变量,不会返回到父进程中。
(. 2.sh )与(source 2.sh)执行命令会在当前进程中进行,变量可以被输出显示。
3 变量表达式
3.1适用整数 test n1 -参数 n2 (真返回0,假返回1)
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
-eq等于
-ne不等于
注 : 可用中括号代替test。例 test 1 -lt 4 等价于 [ 1 -lt 4 ] (表达式与中括号间有空格)
3.2 文件测试 -f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行 -e 文件是否存在
3.3 字符测试 (建议用两个中括号[[ ]])
= , != , -n string 测试指定的字符串长度非0
-z 字符串的长度为0 , > 如果str1的字母顺序比str2大,则返回真,< 如果str1的字母顺序比str2小,则返回真
3.4 其他
! 非运算,表达式为 true则返回 false,否则返回 true[ ! false ] 返回 true。
o 或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
a 与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。
4 控制流程
4.1seq命令
4.2 分支结构
if [ $# -eq 0 ]
then
echo “输入了0个参数”
elif[ $# -gt 1 ]
then echo “输入了多个参数”
else echo “输入了1个参数”
fi
case “$#” in
0)echo “输入了0个参数”;;
1)echo “输入了1个参数”;;
*)echo “输入了多个参数”;;
esac
每个分支条件后必须以两个分号结尾
4.3 循环结构
例子:输出100内10的倍数
#for i in {1..9} (大括号中不能有变量)
for i in `seq1 9`(此处可以用变量 如 `seq $1 9`)
do
echo `expr $i \* 10`
done
4.4 read 变量1 [变量2 …]
可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
4.5 break 跳出内部循环 break2 跳出外部循环
continue 跳出内部判断 continue2 跳出外部判断
5 函数 函数由两部分组成:函数标题和函数体
所有函数在使用前必须定义。必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。
6 数组
echo ${array_var[*]} (打印数组中所有的值 ,单个)
echo ${array_var[@]} (打印数组中所有的值,一串)
echo ${#array_var[*]} (打印数组长度)
shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素。这种数组叫做关联数组。
关联数组的下标和值称为键值对,它们是一一对应的关系。在关联数组中,键是唯一的,值可以不唯一。
注:在使用关联数组之前,需要使用命令declare -A array 进行显示声明
例: name=(jimtom lucy)
declare -A phone
phone=([jim]=135 [tom]=136 [lucy]=158)
for i in `eval echo {0..$((${#name[*]}-1))}`
do
echo ${name[i]} phone number is ${phone["${name[i]}"]}
done
${!array[*]}取关联数组所有键
${!array[@]}取关联数组所有键
${array[*]}取关联数组所有值
${array[@]}取关联数组所有值
${#array[*]} 关联数组的长度
${#array[@]}关联数组的长度