9.3 数组与运算符
本章包含 Bash 中的一维数组以及常用的各种运算符。
Shell 数组
bash 支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始。 数组用括号来表示,元素用空格分割,语法格式如下:
array_name=(value1 ... valuen)
示例:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
my_array=(A B "C" D)
也可以使用下标单独赋值:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组
读取元素的语法为 ${array_name[index]}。
示例:
#!/bin/bash
my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
输出:
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D
所有元素
使用 @ 或 * 可以获取数组中的所有元素:
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
数组长度
获取数组长度的方式与字符串相同:
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"
基本运算符
Shell 支持多种运算符,包括算术、关系、布尔、字符串和文件测试等。
原生 bash 不支持简单数学运算,但可以借助 awk 和 expr。
expr 是一款表达式计算工具,要注意表达式和运算符之间必须有空格,且整条表达式要被反引号包围。
示例:
val=`expr 2 + 2`
echo "两数之和为 : $val"
算术运算符
假定变量 a=10,b=20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| + | 加法 | expr $a + $b 结果为 30 |
| - | 减法 | expr $a - $b 结果为 -10 |
| * | 乘法 | expr $a \* $b 结果为 200 |
| / | 除法 | expr $b / $a 结果为 2 |
| % | 取余 | expr $b % $a 结果为 0 |
| = | 赋值 | a=$b 将把变量 b 的值赋给 a |
| == | 相等 | [ $a == $b ] 返回 false |
| != | 不等 | [ $a != $b ] 返回 true |
注意:条件表达式要放在方括号之间,并且要有空格。
关系运算符
这些运算符只支持数字,用于在条件表达式中比较两个值:
| 运算符 | 说明 | 举例 |
|---|---|---|
| -eq | 等于 | [ $a -eq $b ] 返回 false |
| -ne | 不等 | [ $a -ne $b ] 返回 true |
| -gt | 大于 | [ $a -gt $b ] 返回 false |
| -lt | 小于 | [ $a -lt $b ] 返回 true |
| -ge | 大于等于 | [ $a -ge $b ] 返回 false |
| -le | 小于等于 | [ $a -le $b ] 返回 true |
示例:
a=5
b=8
if [ $a -lt $b ]; then
echo "$a 小于 $b"
fi
布尔运算符
假定 a=10, b=20:
| 运算符 | 说明 | 举例 |
|---|---|---|
| ! | 非 | [ ! false ] 返回 true |
| -o | 或 | [ $a -lt 20 -o $b -gt 100 ] 返回 true |
| -a | 与 | [ $a -lt 20 -a $b -gt 100 ] 返回 false |
这些运算符可以组合多个测试条件:
if [ $a -gt 0 -a $b -lt 100 ]; then
echo "a 大于 0 且 b 小于 100"
fi
以上运算符常与 if 语句或 test 命令一起使用。
算术扩展(推荐)
除了 expr 外,bash 还支持更现代的算术扩展,语法为 $((expression)),不需要反引号且支持 C 风格运算:
x=7
y=$((x * 3 + 2))
echo $y # 输出 23
这样写更简洁、易读,也是脚本中常见的做法。