shell变量是否被解析取决于引号类型:单引号禁用所有解析,双引号支持变量展开和有限转义,不加引号易因空格或通配符出错,混用引号可实现精细控制。

Shell变量是否被解析,关键取决于你用单引号还是双引号包围赋值内容。单引号完全禁用解析,双引号则允许变量展开和部分转义,这是最基础也最容易出错的细节。
单引号:原样保留,不解析任何内容
单引号内的所有字符都被当作字面量处理,包括 $、`(反引号)、\ 和其他特殊符号。哪怕里面写着 $HOME 或 $(date),也不会执行替换。
-
name='Alice'; msg='Hello, $name'; echo "$msg"→ 输出:Hello, $name -
path='/home/$USER'; echo "$path"→ 输出:/home/$USER(不是实际路径) - 适合场景:写正则表达式、日志模板、需要确保字符不被改动的配置片段
双引号:支持变量展开和有限转义
双引号内会解析 $var、${var}、$(command) 和 `command`,同时保留空格和大部分字面意义。反斜杠仅对 $、\`、\"、\ 等少数字符生效。
-
name="Alice"; msg="Hello, $name"; echo "$msg"→ 输出:Hello, Alice -
count=5; echo "There are ${count} items"→ 输出:There are 5 items -
dir="$(pwd)"; echo "Current: $dir"→ 正确获取当前路径
不加引号:有风险,慎用
不加引号时,Shell 会进行单词分割和路径名扩展(glob),遇到含空格、星号或问号的变量值极易出错。
-
file="my report.txt"; cp $file /tmp/→ 实际执行cp my report.txt /tmp/(两个参数,报错) - 正确写法应为
cp "$file" /tmp/ - 仅当变量值确定为纯字母数字、无空格无特殊字符时,才可省略引号
混用技巧:需要部分解析时可拼接
没有“半解析”引号,但可通过单双引号拼接实现精细控制:
prefix='log_'; suffix=$(date +%s); filename="$prefix${suffix}.txt"-
echo 'User: '$USER' is logged in'→ 单引号部分原样,$USER 在外侧被解析 - 避免写成
'User: $USER is logged in'(全被锁死)或"User: $USER is logged in"(全部展开,但这里没问题)











