Shell脚本语法

Shell中的数值运算及运算方式差异 

expr数值运算工具

[[email protected] ~]# aa=11

[[email protected] ~]# bb=22

#给变量aa和变量bb赋值

[[email protected] ~]# dd=$(expr $aa + $bb)=$(( $aa+$bb ))=$[ $aa+$bb ]  注:在(())和[]左右的空格仅仅是为了好看
#dd 的值是 aa 和 bb 的和。注意“ + ”号左右两侧必须有空格

表达式求值:

$ expr 1 + 3

$ expr 2 – 1

$ expr 1 \* 3 使用*要加转义符

$ echo `expr 1 + 3`

注意:表达式中,数字和运算符指教要有空格,出现在 语句中要加反引号

运算符

Shell脚本语法

脚本三种运行方式差异

sh script,./script

当你使用直接运行的方法来处理时, 系统会给予一支新的 bash 让我们来运行脚本里面的命令,因此你 的 firstname, lastname 等变量其实是在下图中的子程序 bash 内 运行的。 当脚本运行完毕后,子程序 bash 内的所有数据便被移除

Shell脚本语法

source script

Shell脚本语法

 Shell中的判断式及控制流程语句 

条件判断命令test

test n1 -参数 n2(或 –参数 表达式)

真返回0,假返回1。
(1)整数,

test 1 –lt 4 #判断1<4

echo $? #结果为0

test语句的等价形式[ 1 –lt 4 ]

可用中括号代替test,把表达式括起来实现判断

注意表达式与中括号间有空格。

Shell脚本语法

(2)文件测试 

-f 存在且是普通文件

-d 存在且是目录

-s 存在且字节数大于0

-r 存在且可读

-w 存在且可写

-x 存在且可执行

Shell脚本语法

(3)字符串测试

test s  字符串s非空

test s1 = s2 字符串s1等于s2

test s1 != s2 字符串s1不等于s2

test -z  s字符串长=0,即为空串

test  -n 字符串长>0 

4、其他参数

-a逻辑与  、-o逻辑或 、  !逻辑非

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

seq命令:产生1-9的数字序列  比如 seq 1 4

1)分支结构

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

2)循环结构

for 例子——输出100以内10的倍数

for i in `seq 1  9` 
do 
   echo `expr $i \* 10` 
done

注意:乘号前加转义字符,与数字间要有空格

read 变量1 [变量2 …] 

可以从键盘上读取多个变量的值,用户输入数据时,以空格 或者Tab键作为分隔。

如果输入的数据个数不够,则从左到右对应赋值,没有输入 的变量为空;

如果输入的数据个数超了,则从左到右对应赋值,最后一个 变量被赋予剩余的所有数据。
-p:指定读取值时的提示符;

例:read –p “please intput a num:”num

#输出a到b序列数各数的10倍数
read a b 
for i in `seq $a $b` 
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

使用while与break,等待用户登录 

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

Shell中的函数 

定义函数 

shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数
函数由两部分组成: 函数标题    函数体

标题是函数名。

函数体是函数内的命令集合。标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先搜索函 数调用相应的shell

定义函数的格式为: 

函数名(){

命令1 . . .

}
例如

hello() 
{ 
echo "Hello there today's date is `date`“ 
}

所有函数在使用前必须定义。这意味着必须将函数放在脚本 开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。上面的例子中,函数名为h ello,函数体包含一个echo语句,反馈当天日期。

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"

打印出特定索引的数组元素内容: 

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

关联数组

shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素。这种数组叫做关联数组(associative array)。

 关联数组的下标和值称为键值对,它们是一一对应的关系 。在关联数组中,键是唯一的,值可以不唯一。 

定义关联数组 

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[@]}  关联数组的长度