首页 / Linux 命令行入门教程 / 83. 变量进阶:数组、命令替换与算术

Linux 命令行入门教程

83. 变量进阶:数组、命令替换与算术

本教程共 90 篇 · 第 83 篇

83. 变量进阶:数组、命令替换与算术

基础变量只能存一个值。bash 还支持数组、命令替换和算术运算,写脚本更顺手。

数组

数组能存一组值。定义时用小括号,元素空格分开:

fruits=(苹果 李子)
echo "${fruits[0]}"   # 取第一个,打印:苹果
echo "${fruits[@]}"   # 取全部,打印:苹果 梨 李子

下标从 0 开始。往数组里追加元素:

fruits=(橙子 "${fruits[@]}" 香蕉)
Tip

遍历数组时一律写成 "${fruits[@]}"(带引号)。这样元素里哪怕有空格,也会被当作一个整体,不会拆散。

删元素用 unsetunset '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++ ))

除了 $(( )),还有 letexpr 两种老写法。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[ ] 拆开讲透。

小结:数组存多个值,命令替换 $() 抓输出,算术 $(( )) 做计算。这三种是写实用脚本的基本功。