更新于 2025-12-09
作用:执行括号内的命令,把输出结果当成变量值返回。
log_file="/var/log/syslog"
keyword="error"
output=$(grep "$keyword" "$log_file")
结果:$output 里保存 grep 的输出内容。
常用于:动态获取命令结果(如时间、路径、统计结果等)。
对比:反引号 `cmd` 也能实现,但 $() 更可读、可嵌套。
命令组(Command Group)
{ sudo apt install exa; echo "Installed exa"; }
一组命令在同一个 shell 环境中顺序执行。
批量展开(Brace Expansion)
for file in backup_{1..4}.tar.gz; do
echo "$file"
done
输出:backup_1.tar.gz … backup_4.tar.gz
常用于批量生成文件名、序列。
作用:执行括号中的命令,但在独立的子 shell 中进行。
(cd /tmp; ls)
不会影响当前 shell 的工作目录。
与 {} 不同:{} 共享环境,() 独立环境。
作用:判断条件是否成立,用于 if 判断。
file="/etc/passwd"
if [ -f "$file" ]; then
echo "File exists"
fi
-f:文件存在
-d:目录存在
-z:字符串为空
注意:方括号两边必须有空格!
作用:增强版 [ ],支持正则匹配、逻辑运算等。
user=$USER
if [[ $user == "root" || $user == "admin" ]]; then
echo "Welcome, superuser!"
fi
支持 &&、||
支持通配符和正则
不需为变量加引号
推荐:脚本里尽量用 [[ ]],比 [ ] 安全、现代。
作用:取变量值,或修改变量值。
filename="report.txt"
backup="${filename%.txt}.bak"
echo $backup # report.bak
支持多种操作:
${var:-default}:为空时用默认值
${var%pattern}:删除匹配后缀
${var#pattern}:删除匹配前缀
非常强大,是 Bash 变量处理的关键工具。
作用:执行整数运算。
num1=5
num2=3
result=$(( num1 * num2 + 1 ))
echo $result # 16
比 expr 更简洁、更快。
可做加减乘除、自增自减。