linux shell中用$(command)或反引号将命令输出赋值给变量,推荐$(...);等号两侧不可有空格;输出保留换行与空格,引用时需加双引号;退出码需单独检查。

在 Linux Shell 中,将命令执行结果赋值给变量,主要用命令替换(Command Substitution),有两种等价写法:$(command) 和反引号 `command`,推荐使用 $(...) 形式,更清晰、易嵌套、可读性好。
基本语法:用 $() 捕获命令输出
Shell 会执行括号内的命令,并将其标准输出(不含 stderr)作为字符串返回,然后赋值给变量:
-
正确写法(推荐):
result=$(ls -l /tmp) -
等价但不推荐的写法:
result=`ls -l /tmp`(嵌套困难,易与单引号混淆) - 赋值时等号两侧不能有空格,否则会被当作命令执行,报错“command not found”
注意空白与换行:输出会原样保留
命令的换行符和多余空格默认保留在变量中。例如:
-
files=$(ls /etc | head -2)→$files包含两行内容 - 直接
echo $files会把换行转为空格(因未加引号);应写成echo "$files"保持格式 - 如需去除首尾空白,可用
$(command | xargs)(xargs 自动裁剪并压缩空白)
捕获退出状态:单独判断命令是否成功
命令替换只捕获 stdout,不改变命令本身的退出码。要检查是否执行成功,需在赋值后立即用 $? 或 if 判断:
output=$(grep "root" /etc/passwd); ret=$?if [ $ret -eq 0 ]; then echo "找到匹配"; else echo "未找到"; fi- 也可合并写为:
if output=$(grep "root" /etc/passwd); then echo "成功:$output"; fi
避免常见错误
-
不要写成
var = $(cmd)(空格导致语法错误) -
不要依赖未引号的变量展开,如
echo $output在含空格/通配符时可能出错,应写echo "$output" -
管道中的命令替换作用域有限:在
cmd1 | while read line; do var=$line; done中,var在 while 外为空(子 shell 问题),改用while ... done 或重定向解决











