shell中单引号和双引号的区别-经典解释

本文主要介绍了Shell中引号和反斜杠的使用。单引号关闭所有meta,双引号关闭大部分meta,$、\\、`不被忽略。反斜杠可作转义字符或续行符。还对比了$()和``的区别,通过举例说明了在shell和awk等命令中引号和反斜杠的正确使用方法。

最简短解释

  1. hard quote:单引号,关闭所有的meta(什么是meta,自己查吧)

  2. soft quote:双引号,关闭大部分的meta,但是某些保留,括在双引号中的三种特殊字符不被忽略:$,\,`

  3. escape:反斜杠,它只会关闭紧跟escape之后的字符。

进一步解释

双引号 ( " " )

双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,,` ,即双引号会解释字符串的特别意思,而单引号直接使用字符串.

反斜杠 backslash-escaped( )

反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号
echo -e “n”
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。
BTW

$()和``的区别

反引号和()的功能是命令替换,将反引号或()的功能是命令替换,将反引号或()()中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量
但反引号内不能再引用反引号,而$()中可以引用反引号

举例

参考cu上经典的十三问,hard quote关闭shell的meta,而soft quote关闭大部分的shell meta,但是$例外,对于bash的来说,命令的解释是从左到右的,首先遇到hard quote和soft quote,所作的解释是不一样,看这个例子:
$ a=1
$ echo "KaTeX parse error: Expected 'EOF', got '#' at position 21: … #̲被bash解释到
$ echo “’$a’”
‘1’ #hard quote被关闭
$ echo ‘$a’
KaTeX parse error: Expected 'EOF', got '#' at position 18: … #̲被hard quote关闭
$ echo '“a"′"a"' "a""a” #所有都被关闭了

如果能够理解上面的了,那基本知道怎么用单引号和双引号了。

而对于awk、ed等等命令,需要区分shell meta和command meta
对于awk来说,它的{ }:是将其内的命令置于non-named function 中执行,awk用{ }来区分命令段,例如BEGIN,END等等。举个例子:
$ awk {print $1} b.txt
awk: line 2: missing } near end of file

看看报错,如果直接使用{ },那么我们知道{ }没有被shell关闭,也就是说它看成shell的meta了,当然报错了,所以要关闭,同时shell中的也关闭,也就是也关闭,也就是需要成为awk的meta了,很好理解吧?如下输出了内容。
awk ‘{print $1}’ b.txt
./0/137/qq/.zhangqx
./0/10/qq/.zyyao
./0/115/qq/.ywt

既然要要关闭{ },那么也可以用soft quote,
awk "{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 0}̲" b.txt 0 0 0 可…还是被shell解释了,这次我们可以用escape,将$关闭了。
$ awk “{print $0}” b.txt
./0/137/qq/.zhangqx
./0/10/qq/.zyyao
./0/115/qq/.ywt

说到这里,可以大家都一点明白了,并不是awk ‘{ }’ urfile是awk的固定语法,而是为了让awk能够跳脱shell的偷取其命令和参数,看看这个例子就明白了。
$ awk {print $0} b.txt
./0/137/qq/.zhangqx
./0/10/qq/.zyyao

所作的一切是为了让awk或者自己的meta,请切记注意print后的空格,也要关闭,要不又被shell解释了。

**题目重述** Shell单引号双引号、反引号的区别是什么? --- **详解** 在 Shell 脚本命令行中,**单引号 `'`**、**双引号 `"`** **反引号 `` ` ``** 具有不同的作用,尤其是在字符串处理变量解析方面。它们的核心区别在于:**是否允许变量替换、命令替换特殊字符展开**。 --- ### 1. 单引号 `'...'` - **特点**:**最强的保护机制**,禁止任何变量扩展、命令替换或转义字符解析。 - 所有内容都被视为**纯文本**。 - **不能包含单引号本身**(除非转义,但会破坏引用)。 ```bash name="Linux" echo '$name 的世界' # 输出:$name 的世界 ``` > 变量 `$name` 不会被解析,原样输出。 --- ### 2. 双引号 `"..."` - **特点**:**保留大部分字面意义,但允许变量替换、命令替换部分转义字符**。 - 支持 `$()` 或 `` `...` `` 进行命令替换。 - 支持 `$var`、`${var}` 等变量展开。 - 常见转义如 `\n`、`\t`、`\"` 在双引号内有效。 ```bash name="Linux" echo "$name 的世界" # 输出:Linux 的世界 echo "当前目录: $(pwd)" # 输出:当前目录: /home/user echo "换行符:\n新行" # \n 被识别为换行(取决于是否用 -e) ``` > 推荐用于大多数需要变量插入的场景。 --- ### 3. 反引号 `` `...` `` - **功能**:执行其中的命令,并将输出结果**替换回原位置**(即命令替换)。 - 已被现代语法 `$()` 取代,但仍兼容使用。 - **可嵌套性差**,且容易与单引号混淆。 ```bash echo "今天是 `date`" # 输出:今天是 Mon Apr 5 10:00:00 CST 2025 echo "当前用户: `whoami`" # 输出:当前用户: user ``` > 注意:反引号内部若包含反引号,需用 `\`` 转义,语法复杂。 ✅ **推荐使用 `$()` 替代反引号**: ```bash echo "目录数: $(ls | wc -l)" ``` 更清晰、支持嵌套(如 `$(cmd1 $(cmd2))`)。 --- ### 对比总结表 | 引号类型 | 是否解析变量 | 是否执行命令替换 | 是否解析转义字符 | 主要用途 | |----------|----------------|--------------------|---------------------|-----------| | 单引号 `' '` | ❌ 否 | ❌ 否 | ❌ 否 | 完全字面输出,防止任何展开 | | 双引号 `" "` | ✅ 是 | ✅ 是(`$()` 或 `` ` ` ``) | ✅ 是(`\n`, `\"` 等) | 安全地包含变量命令结果 | | 反引号 `` ` ` `` | ❌ 否(本身不解析变量)<br>但执行命令 | ✅ 是(执行命令并返回结果) | ⚠️ 部分支持 | 实现命令替换(建议用 `$()` 替代) | --- ### 示例对比 ```bash name="Shell" # 单引号:完全原样输出 echo 'Hello $name, today is `date`' # 输出:Hello $name, today is `date` # 双引号:变量命令都解析 echo "Hello $name, today is $(date)" # 输出:Hello Shell, today is Mon Apr 5 10:00:00 CST 2025 # 反引号:仅执行命令 echo `echo "Hi $name"` # 输出:Hi Shell(先执行内部命令) ``` --- ### 知识点 - **单引号完全屏蔽解析**:所有内容视为字面量,适合避免注入风险。 - **双引号支持安全扩展**:允许变量命令替换,同时防止词法分割,是最佳实践。 - **反引号用于命令替换**:虽可用,但 `$()` 更清晰、易嵌套,应优先使用后者。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值