linux shell中用命令替换将命令结果存入变量,推荐$(command)语法;赋值时=号前后不可有空格,含特殊字符时用双引号包裹,引用变量建议用${var}避免歧义。

在 Linux Shell 中,把命令的执行结果存入变量,核心是“命令替换”(command substitution),也就是让 Shell 先运行命令,再把它的标准输出(stdout)作为字符串赋给变量。关键就两点:语法写对、引号用准。
两种标准写法:反引号和 $()
Shell 支持两种等效的命令替换语法,推荐用 $(),更清晰、易嵌套、也更现代:
-
反引号方式(`...`):
变量名=`命令`
注意:这个不是单引号,是键盘左上角 ESC 下方、数字 1 左边那个键(常和 ~ 同键)。 -
$() 方式(推荐):
变量名=$(命令)
括号内可直接写命令,支持多层嵌套,比如 $(echo $(date +%Y))。
例如获取当前路径:
PWD_PATH=$(pwd)
FILES=$(find /tmp -name "*.log" -mtime -1)
变量定义时的细节必须注意
赋值语句中 = 号前后绝对不能有空格,否则 Shell 会当成执行命令而非赋值:
- ✅ 正确:result=$(ls -l)
- ❌ 错误:result = $(ls -l)(报错:command not found)
如果命令输出含空格、换行或特殊字符,建议用双引号包裹整个赋值表达式(尤其在脚本中):
files_list="$(find /home -name 'config*')"
这样能保留原始格式(包括换行),避免被 Shell 拆分成多个单词。
引用变量时推荐加花括号 ${}
使用变量时写成 ${var} 而非 $var,可避免歧义:
- 当变量后紧跟字母/数字时,比如想拼接 ${name}123.txt,不加花括号会被解释为变量 $name123(不存在)。
- 即使简单场景,统一用 ${var} 是更健壮、易读的习惯。
例如:
ext=".jar"; full_name="${app_name}${ext}"
常见误区与提醒
- 命令执行失败(返回非零退出码)时,变量仍会被赋值为空字符串,不会报错。如需判断是否成功,应单独检查 $? 或用 if 包裹命令。
- 命令输出中的尾部换行符会被自动去除(这是命令替换的默认行为),但内部换行保留。
- 错误输出(stderr)默认不被捕获。如需同时捕获,可用 $(cmd 2>&1);若只想丢弃错误,加 2>/dev/null。











