1.Shell中的数值运算及运算方式差异
(1)expr运算工具:
aa=11
bb=22
cc=$(expr $aa + $bb) 注意运算符两边的空格,不加空格的打印出两个字符和“+“,不运算
cc=$[$aa+$bb]
cc=${{$aa+$bb}}
(2)脚本运行的差异:
sh filename.sh 当以此方式运行时系统另起一个子进程
source filename.sh 当以此方式运行时直接在父进程中进行
2.Shell中的判断式及控制流程语句
(1)条件判断命令test:
整数测试比较运算符见上图 test 1 –lt 4 #判断 1<4 echo $? #结果为0
文件测试 test -d “mydoc” 判断mydoc是否是目录
字符串测试见上图
其他参数 -a逻辑与 -o逻辑或 !逻辑非
(2) shell运算符和C语言基本类似,也有分支、循环流程 控制。
seq命令:产生1-9的数字序列 比如 seq 1 9
分支结构 :if 和 case
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
每个分支条件后必须以两个分号结尾
循环结构: for 和 while
for i in {1..9} #大括号中不能有变量
for i in `seq 1 9`
do echo `expr $i \* 10`
done
while例子——求1到100的和
i=1
sum=0
while [ $i –le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
break 和 continue与平时的编程语言的用法一样,只是shell中还有break2 和 continue 2 :跳出两层整个循环和跳出两层本次循环
以上标红的为语句的关键部分
read 变量1 [变量2 …] 可以从键盘上读取多个变量的值,用户输入数据时,以空格 或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入 的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个 变量被赋予剩余的所有数据。
-p:指定读取值时的提示符;
read –p “please intput a num:”num
3.Shell中的函数
定义函数的格式为:
函数名() {
命令1 . . .
}
函数名()
{
命令1 . . .
}
参数可以传递给函数,并由脚本进行访问:
函数名 参数1 参数2 ....
以下是函数fname的定义:
fname() {
echo $1,$2; #访问参数1和参数2
echo "$@"; #以列表的方式一次性打印所有参数
echo "$*"; #类似于$@,但是参数被作为单个实体
return 0; #返回值
}
4.Shell数组
(1)普通数组的定义类似于java语言
打印出特定索引的数组元素内容:
echo ${array_var[0]}
index=4
echo ${array_var[$index]}
以清单形式打印出数组中的所有值:
echo ${array_var[*]} 作为单个字符打印
也可以这样使用
echo ${array_var[@]} 作为一个整体打印
打印数组长度:
echo ${#array_var[*]}
(2)shell 提供了另外一种数组,其可以使用任意的字符串作 为下标(不必是整数)来访问数组元素。这种数组叫做关联数组 关联数组的下标和值称为键值对,它们是一一对应的关系 。在关联数组中,键是唯一的,值可以不唯一。
定义关联数组 shell 的关联数组和 shell 的下标数组在定义和使用上完 全一样,只是在索引上有区别。
需要注意的是,在使用关联数组之前,需要使用命令 declare -A array 进行显示声明
实例: name=(jim tom 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
在命令提示符下输入 ./test.sh,执行结果如下:
jim phone number is 135
tom phone number is 136
lucy phone number is 158
${!array[*]} 取关联数组所有键
${!array[@]} 取关联数组所有键
${array[*]} 取关联数组所有值
${array[@]} 取关联数组所有值
${#array[*]} 关联数组的长度
${#array[@]} 关联数组的长度