5月29日 01:20

Shell 脚本中单引号和双引号有什么区别?

单引号是强引用,内部所有字符按字面量处理,变量 $var、命令替换 $(cmd)、转义符 \n 全部原样输出。双引号是弱引用,允许变量展开、命令替换和少数转义($ " \ \n),其余字符原样保留。实际开发中 90% 的场景用双引号——既能展开变量,又能防止空格拆分和 glob 展开。只在需要原样输出 $ 符号或特殊字符时才用单引号。另外 $'...' 语法支持 \n \t 等转义序列,是 echo -e 的替代方案。

追问

1. 不加引号、双引号、单引号对变量赋值有什么不同? 不加引号时变量值会被 word splitting 和 glob 展开:var=hello world 会报错,var=*.txt 会展开为匹配的文件列表。双引号阻止 word splitting 和 glob 但保留变量展开。单引号阻止一切展开。

2. 单引号里怎么输出单引号本身? 单引号内无法转义单引号。解决办法是用拼接:'it'''s' ——结束单引号、转义单引号、重新开始单引号。或改用双引号 "it's"。

3. $'...' 和 "..." 都支持转义,有什么区别? $'...' 只做转义展开,不做变量和命令替换,是真正的转义字符串。"..." 既做转义又做变量/命令替换。需要转义但不需变量展开时用 $'...' 更精确。

4. 双引号能防止哪些问题?举个实际例子。 防止空格拆分:file="my doc.txt"; rm "$file" 正确删除,不加引号会删 my 和 doc.txt 两个文件。防止 glob 展开:echo "*.txt" 输出字面量,不加引号会列出所有 .txt 文件。

5. 单引号和双引号有性能差异吗? 理论上单引号更快(跳过展开解析),但差异极小可忽略。选择依据应是语义正确性而非性能。

写段代码

bash
name="world" echo 'Hello $name' # Hello $name echo "Hello $name" # Hello world echo $'line1\nline2' # 换行输出 echo 'it'\''s me' # it's me
标签:Shell