四、数组:
在bash下,shell仅支持一维数组,不限制数组大小,不支持多维数组,下标由0开始。
4.1、定义数组:
以空格为间隔,若值为字符类型,需要添加单引号或双引号
#一般定义
数组名=(a b c d)
#多级定义
数组名=(
a
b
c
d
)
等
4.2、数组操作:
-
读取:类似于变量读取,使用
$
符号,需加上数组下标。var=${array[n]} #读取单个元素 var=${array[@]} #读取全部元素 var=${array[*]} #读取全部元素
-
获取数组长度:使用
#
获取数组长度,在shell中越界访问数组不会报错。# 取得数组元素的个数 length=${#array_name[@]} # 从头到尾取 # 或者 length=${#array_name[*]} # 取所有 # 取得数组单个元素的长度 length=${#array_name[n]} # 取特定
4.3、遍历数组:
-
使用
for
(或则while
循环)循环遍历数组元素: -
使用
${a[*]}
或则${a[@]}
遍历数组
4.4、数组截取:
${array[@]:x:y} #从x位开始截取数组array中的y个元素
4.5、数组字符替换:
${数组名[@]/旧字符串/新字符串} 用新字符串替换第一次匹配到的旧字符串,仅为临时替换不会影响原有数组,可通过重新赋值实现替换原有数组。
4.6、数组拼接:
思路:将数组中的所有字符全部取出,再拼接赋值。
4.7、删除数组元素:
unset array[n] #删除数组array中下标为n的元素
第四节示例:
#!/bin/bash
array=(a b c d e fasfafaf g)
b=(1 2 3 4 5)
e=(aaaaaaaaaa)
echo $array
echo $b
echo $e
for((i=0;i<${#array[*]};i++))
do
echo "a[$i]=${array[$i]}"
done
echo ${array[*]}
echo ${array[@]}
echo ${array[5]}
for((i=0;i<${#array[*]};i++))
do
echo "a[$i]=${array[$i]}"
done
echo ${array[*]}
echo ${array[@]}
echo ${array[5]}
lenth=${#array[*]}
lenth1=${#array[5]}
echo $lenth
echo $lenth1
echo ${array[@]:2:4}
c=${array[*]}${b[*]}
echo $c
d=${e[@]/a/b}
echo $d
unset array[5]
echo ${array[*]}
五、变量传参:
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n
。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……,脚本编写如下,保存为test.sh
在使用shell传递参数的时候,常常需要用到以下的几个字符来处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如$* 用「”」括起来的情况、以$1 $2 … $n 的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如"@“用「”」括起来的情况、以"$1" “2 " … " 2" … "2"…"n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
六、运算符:
常见运算符为:算数运算符、关系运算符、布尔运算符、逻辑运算符、字符串运算符、文件测试运算符。
原生的bash不支持简单的数学运算,通常需要通过其他命令来实现。
6.1、算数运算符:
如使用算符运算符就需要搭配的常用的工具有两种
-
awk
-
expr(使用频繁)
以下表格中的a
和b
都是变量。
运算 | shell中格式 |
---|---|
加法 | expr $a + $b |
减法 | expr $a - $b |
乘法 | expr $a \* $b 在windows系统中乘号(*)前边必须加反斜杠()才能实现乘法运算; |
除法 | expr $b / $a |
取余 | expr $b % $a |
赋值 | a=$b |
相等 | [ $a == $b ] |
不相等 | [ $a != $b ] |
运算规则注意点:
-
表达式和运算符之间必须要有空格,例如 3+2 是不对的,必须写成 3 + 2
-
完整的表达式要被 两个" ` "包含(在 Esc 键下边那个键)
关系运算示例代码:
#!/bin/bash
a=9
b=6
echo "a的值为: $a"
echo "b的值为: $b"
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b`
echo `expr $a / $b`
echo `expr $a % $b`
if [ $a == $b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
a=$b
echo $b
6.2、关系运算符:
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
需要注意的点:
-
运算符和数之间必须要用空格隔开
6.3、布尔运算符:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 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。 |
6.4、逻辑运算:
运算 | shell中的实现 | 主要符号 |
---|---|---|
逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] | && |
逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] | || |
-
这里使用两层的[ ]符号,将两次关系运算的结果保存在条件句中
布尔运算符和逻辑运算符的区别:
语法上,逻辑运算需要双括弧,布尔运算只需要单大括弧
功能上,逻辑运算具有特殊的短路功能,即是在AND运算中第一个表达式为false时则不执行第二个表达式,在OR运算中第一个表达式为true时不执行第二个表达式。
6.5、字符串运算:
shell中常用的字符串运算符如下表。假定变量 a 为 “abc”,变量 b 为 “def”
运算 | shell中的实现 | 主要符号 |
---|---|---|
检测两个字符串是否相等 | [ $a = $b ] | = |
检测两个字符串是否不相等 | [ $a != $b ] | != |
检测字符串长度是否为0 | [ -z $a ] | -z |
检测字符串长度是否不为 0 | [ -n “$a” ] | -n |
检测字符串是否为空 | [ $a ] | $ |
6.7、文件测试运算符:
主要用于检测unix文件的各种属性:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
6.8、运算指令:
-
(( ))
:我们可以直接使用双圆括弧计算其中的内容,如((var=a+b)),该指令经常在if/while等条件判断中需要计算时使用 -
let
:在计算表达式的时候我们可以直接使用let,如let var=a+b。 -
expr:
在前面的内容中我们也提到了它,是非常常用的计算指令,使用时需要在外部增反引号,如var=expr a+b。
-
bc计算器: bc计算器支持shell中的小数进行运算,并且可以交互式或者非交互式的使用。基本使用方式为var=$(echo "(1.1+2.1)"|bc)。
-
$[]
:我们可以直接使用这种方式计算中括弧中的内容,如echo $[1+2]。