Shell脚本语法

数字运算及运算符

  • expr 数值运算工具

[[email protected] ~]# aa=11
[[email protected] ~]# bb=22
#给变量aa和变量bb赋值
[[email protected] ~]# dd=$(expr $aa + $bb)
#dd 的值是 aa 和 bb 的和。注意“ + ”号左右两侧必须有空格

  • “$((运算式))”
  • 或“$[运算式]”

[[email protected] ~]# aa=11
[[email protected] ~]# bb=22
[[email protected] ~]# ff=$(( aa+aa+bb ))
[[email protected] ~]# gg=$[ aa+aa+bb ]
注:在(())和[]左右的空格仅仅是为了好看

  • 运算符
    Shell脚本语法
    [[email protected] ~]# aa=KaTeX parse error: Expected 'EOF', got '#' at position 18: … (11+3)*3/2 )) #̲虽然乘和除的优先级高于加,但是…(( 14%3 ))
    #14 不能被 3 整除,余数是 2
    [[email protected] ~]# cc=$(( 1 && 0 ))
    #逻辑与运算只有想与的两边都是 1 ,与的结果才是 1 ,否则与的结果是 0

  • 运行方式差异(source, sh script, ./script)
    sh 在执行前后都无法搜索到你定义的变量,可以不经过chmod
    source和.可以在执行后搜索到你定义的变量,需要经过chmod

1、条件判断命令test
test n1 -参数 n2(或 –参数 表达式)
真返回0,假返回1。

  • (1)整数,比较运算符
    -lt 小于
    -le 小于等于
    -gt 大于
    -ge 大于等于
    -eq 等于
    -ne 不等于

test 1 –lt 4 #判断1<4
echo $? #结果为0

test语句的等价形式[ 1 –lt 4 ]
可用中括号代替test,把表达式括起来实现判断
注意表达式与中括号间有空格。

  • (2)文件测试
    -f 存在且是普通文件
    -d 存在且是目录
    -s 存在且字节数大于0
    -r 存在且可读
    -w 存在且可写
    -x 存在且可执行
    如:test -d “mydoc”判断mydoc是否是目录

  • (3)字符串测试
    test s 字符串s非空
    test s1 = s2 字符串s1等于s2
    test s1 != s2 字符串s1不等于s2
    test -z s字符串长=0,即为空串
    test -n 字符串长>0

  • 其他参数
    -a 逻辑与
    -o逻辑或
    ! 逻辑非

控制流程

shell运算符和C语言基本类似,也有分支、循环流程控制

  • 分支结构

if分支

if [ $# -eq 0 ]
then
echo “输入了0个参数”
elif [ $# -gt 1 ]
then echo “输入了多个参数”
else echo “输入了1个参数”
fi

case
case “$#” in
0) echo “输入了0个参数” ;;

  1. echo “输入了1个参数” ;;
    *) echo “输入了多个参数”;;
    esac
    每个分支条件后必须以两个分号结尾

循环结构

  • for

for i in seq 1 9
do
echo expr $i \* 10
done
或写 echo $(expr $i * 10)

注:如果使用这种方式的for i in {10…1} #在大括号中不能用变量
乘号前加转义符,与数字间要有空格。

read 变量1 [变量2 …]
可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。
-p:指定读取值时的提示符;
read –p “please intput a num:”num

while例子——求1到100的和
i=1
sum=0
while [ ile100]dosum=i –le 100 ] do sum=[sum+sum+i]
i=[[i+1]
done
echo $sum

使用while与break,等待用户登录
#等待特定用户登录,每30秒确认一次
printf “Enter username:”
read user
while true
do
if who |grep “$user” > /dev/null
then
break
fi
sleep 30
done

Break和continue命令都可以接受可选的数值参数,可分别用来指出要中断(break)或继续多少个被包含的循环

  • 定义函数

shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数

函数由两部分组成:
函数标题
函数体

hello()
{
echo "Hello there today’s date is date
}
所有函数在使用前必须定义。这意味着必须将函数放在脚本
开始部分,直至shell解释器首次发现它时,才可以使用。

数组

数组是shell脚本非常重要的组成部分,它借助索引将多个独立的数据存储为一个集合。普通数组只能使用整数作为数组索引。Bash也支持关联数组,它可以使用字符串作为数组索引。在很多情况下,采用字符串式索引更容易理解,这时候关联数组就派上用场了。

可以在单行中使用一列值来定义一个数组:
array_var = (1 2 3 4 5 6)
#这些值将会存储在以0为起始索引的连续位置上
另外,还可以将数组定义成一组“索引-值”:
array_var[0]=“test1”
array_var[1]=“test2”
array_var[2]=“test3”
array_var[3]=“test4”
array_var[4]=“test5”

shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素。这种数组叫做关联数组(associative array)。
关联数组的下标和值称为键值对,它们是一一对应的关系。在关联数组中,键是唯一的,值可以不唯一。
定义关联数组
shell 的关联数组和 shell 的下标数组在定义和使用上完全一样,只是在索引上有区别。
需要注意的是,在使用关联数组之前,需要使用命令declare -A array 进行显示声明。

语法 描述
${!array[]} 取关联数组所有键
${!array[@]} 取关联数组所有键
${array[
]} 取关联数组所有值
${array[@]} 取关联数组所有值
${#array[*]} 关联数组的长度
${#array[@]} 关联数组的长度