推荐使用 $(...) 替换语法,它是现代 shell 脚本标准写法,嵌套方便、可读性好、不易出错;反引号 ... 为老式写法,嵌套困难且易与单引号混淆。

直接用命令替换语法就行,两种写法都行,推荐用 $(...)。
用 $() 捕获命令输出
这是现代 Shell 脚本的标准写法,嵌套方便、可读性好、不易出错。
- 语法:变量名=$(命令)
- 命令执行后的标准输出(不含错误)会作为字符串赋给变量
- 支持嵌套,比如
count=$(wc -l - 注意:括号内命令的引号、变量引用要照常处理,例如:
SOURCE_JAR_PATH=$(find "$SOURCE_PATH/$SERVER_NAME/target/" -name "*$SERVER_NAME*.jar")
用反引号 `...` 也能用但不推荐
这是老式写法,功能一样,但嵌套困难、视觉上容易和单引号混淆。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 语法:变量名=`命令`
- 键盘上是 Esc 下方、数字 1 左边那个键,不是单引号
- 嵌套时需层层转义,比如:
var=`echo \`date\``,可读性差 - 如果命令里本身含反引号,就得用反斜杠转义,容易漏
赋值时要注意的细节
看似简单,但几个地方容易踩坑:
- 等号两侧不能有空格,
result=$(ls)✅,result = $(ls)❌(会报 command not found) - 变量名不能含破折号或空格,只能是字母、数字、下划线,且不能以数字开头
- 命令若有换行符,变量会完整保留(包括换行),需要用
printf %q或tr '\n' ' '处理,视需求而定 - 如果想捕获错误信息,得重定向 stderr,例如:
output=$(some_cmd 2>&1)
常见用途示例
实际脚本里经常这么用:
- 获取当前路径:
CUR_DIR=$(pwd) - 取文件行数:
LINES=$(wc -l - 查进程 PID:
PID=$(pgrep nginx) - 格式化日期:
TODAY=$(date +%Y-%m-%d) - 组合多个命令:
IP=$(hostname -I | awk '{print $1}')










