Linux 命令行入门教程
83. 变量进阶:数组、命令替换与算术
本教程共 90 篇 · 第 83 篇
83. 变量进阶:数组、命令替换与算术
基础变量只能存一个值。bash 还支持数组、命令替换和算术运算,写脚本更顺手。
数组
数组能存一组值。定义时用小括号,元素空格分开:
fruits=(苹果 梨 李子)
echo "${fruits[0]}" # 取第一个,打印:苹果
echo "${fruits[@]}" # 取全部,打印:苹果 梨 李子
下标从 0 开始。往数组里追加元素:
fruits=(橙子 "${fruits[@]}" 香蕉)
Tip遍历数组时一律写成
"${fruits[@]}"(带引号)。这样元素里哪怕有空格,也会被当作一个整体,不会拆散。
删元素用 unset:unset 'fruits[1]'。
命令替换
想把一条命令的输出存进变量,用 $() 包住命令:
now=$(date +%T)
echo "现在时间:$now"
files=$(ls)
echo "当前目录文件数:$(echo "$files" | wc -l)"
$() 可以嵌套,里面还能再套命令。老写法用反引号 `date`,但反引号嵌套麻烦,新脚本统一用 $()。
算术运算
bash 里做数学要用 $(( )) 包起来。变量名在里面不用再加 $:
x=4
y=7
echo $(( x + y )) # 11
echo $(( x * y )) # 28
echo $(( (x + y) / 2 )) # 5
比较常用在判断里,后面 §86 会细讲。自增自减也能写:$(( x++ ))。
除了 $(( )),还有 let 和 expr 两种老写法。let 用法:let "z = x + y"。expr 已经很少用,知道有这回事即可,新脚本优先 $(( ))。
综合小例
统计某个目录下 .sh 文件个数:
#!/bin/bash
count=0
for f in *.sh; do
[ -f "$f" ] && count=$(( count + 1 ))
done
echo "当前目录有 $count 个脚本文件"
这个例子用到了数组外的命令替换、算术和通配符,后面几章会把 for 和 [ ] 拆开讲透。
小结:数组存多个值,命令替换 $() 抓输出,算术 $(( )) 做计算。这三种是写实用脚本的基本功。