一、Shell中的数值运算及运算方式差异
1. expr:数值运算工具
表达式求值:$(expr 运算式)
$ expr1 + 3
$ expr2 –1
$ expr1 \* 3 使用*要加转义符
$ echo`expr1 + 3`
注意:表达式中,数值和运算符之间要有空格,出现在表达式中要加反引号
其他的表达式形式:$((运算式)) $[运算式]
2. 运行方式差异
当用 sh filename.sh方式运行时,系统会为程序创建子进程,运行完成后,子进程bash内的所有数据便被移除
当用source filename.sh方式运行时,程序便会在父进程中运行,数据会被保留
二、shell中的判断式及控制流程语句
1. 条件判断命令test
test n1 –参数 n2(或 –参数 表达式) 真的返回0,假的返回1
(1) 整数
比较运算符
-lt小于
-le小于等于
-gt大于
-ge大于等于
-eq等于
-nq不等于
test语句的等价表达式 [ 1 –lt 4 ] 注:表达式与中括号间有空格
2. 文件测试
-f:存在且是普通文件
-d:存在且是目录
-s:存在且字节数大于0
-r:存在且可读
-w:存在且可写
-x:存在且可执行
3.字符串测试
test s 字符串s非空
test s1 == s2 字符串s1等于s2
test s1 != s2 字符串s1不等于s2
test –z 字符串s长为0,即为空串
test –n 字符串长度>0
3. 其他参数
-a 逻辑与
-b 逻辑或
!逻辑非
三、控制流程
简单举例:seq命令:产生1-9的数字序列
1. 分支结构
If分支:举例如下
if [ $# -eq0 ]
then
echo “输入了0个参数”
elif[ $# -gt 1 ]
then echo “输入了多个参数”
else echo “输入了1个参数”
fi
case分支:举例如下
case “$#” in
0)echo “输入了0个参数”;;
1)echo “输入了1个参数”;;
*)echo “输入了多个参数”;;
esac
每个分支条件后必须以两个分号结尾
2. 循环结构
for 例子:
for i in `seq1 9`
do
echo `expr$i\* 10`
done
或写echo $(expr$i\* 10)
注意:如果使用这种方式的for i in{1..10} 在大括号里不能用变量
3. read:读取
可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
-p:指定读取值时的提示符;
read–p “please input a num:” num
4. while
while例子:求1-100的和
i=1
sum=0
while [ $i–le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
Break和continue命令都可以接受可选的数值参数,可分别用来指出要中断(break)或继续多少个被包含的循环
四、shell中的函数
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用
参数可以传递给函数,并由脚本进行访问:
fnamearg1 arg2;#传递参数
五、shell中的数组
1.一般数组
可以在单行中使用一列值来定义一个数组:
array_var=(1 2 3 4 5 6)
另外,还可以将数组定义成一组“索引-值”:
array_var[0]="test1"
打印出特定索引的数组元素内容:
echo ${array_var[0]}
test1
index=4
echo ${array_var[$index]}
test5
以清单形式打印出数组中的所有值:
echo ${array_var[*]}
test1 test2 test3 test4 test5
也可以这样使用
echo ${array_var[@]}
test1 test2 test3 test4 test5
打印数组长度:
echo ${#array_var[*]}
5
2.关联数组
shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素。这种数组叫做关联数组 (associative array)。
关联数组的下标和值称为键值对,它们是一一对应的关系。在关联数组中键是唯一的, 值可以不唯一。
需要注意的是,在使用关联数组之前,需要使用命令declare -A array 进行显示声明
语法 描述
${!array[*]} 取关联数组所有键
${!array[@]} 取关联数组所有键
${array[*]} 取关联数组所有值
${array[@]} 取关联数组所有值
${#array[*]} 关联数组的长度
${#array[@]} 关联数组的长度