- 论坛徽章:
- 0
|
本帖最后由 runintostar 于 2014-03-12 20:38 编辑
回复 1# 844097977
感谢LZ给机会我好好的思考个中区别 (PS:如果LZ用ksh的话, 输出结果就会千差万别 )
简单说下自己的理解吧, 也许在shell中对\的理解和说法有点不正确, 但大致方向应该没错
(1)\在shell中如果没有被'或者是"来protect的话, 会转义紧跟在它后面的任意一个字符, 转义结果不变(\b还是b)
(2)而在'和"中, \都可以被保护,即其表象为就是一个字符\
(3)但是shell十三问中曾经阐述过'和"的区别, '中是消除任何字符特殊含义的, "中则保留部分元字符的特殊意义, 例如最常用到的$.那么如果我们需要在"中输出一个$字符怎么办?因此"中\同样拥有对部分escape的功能, 具体对哪些字符我没法确定, 只能说我发现bash的"中, \至少可以用来escape \和$和'和"四个字符.
综上述, 现在你的例子中说明:
- #在"中赋值时\被protect, 结果为a\b
- $ x="a\b";echo 'when x="a\b"';echo 'echo $x:'$x
- when x="a\b"
- echo $x:a\b
- #在"中赋值时第二个\被第一个\转义, 结果为a\b
- $ x="a\\b";echo 'when x="a\\b"';echo 'echo $x:'$x
- when x="a\\b"
- echo $x:a\b
- #在"中赋值时第二个\被第一个\转义, 第三个\后面跟的不是特殊原字符, 所以类似于第一种情况, 我们说它被protect了
- $ x="a\\\b";echo 'when x="a\\\b"';echo 'echo $x:'$x
- when x="a\\\b"
- echo $x:a\\b
- #没有被'或者"括住, 第二个\被第一个\转成\
- $ x=a\\b;echo 'when x=a\\b';echo 'echo $x:'$x
- when x=a\\b
- echo $x:a\b
- #没有被'或者"括住, 第二个\被第一个\转成\, b被第三个\转成b
- $ x=a\\\b;echo 'when x=a\\\b';echo 'echo $x:'$x
- when x=a\\\b
- echo $x:a\b
- #没有被'或者"括住, b被第一个\转成b
- $ x=a\b;echo 'when x=a\b';echo 'echo $x:'$x
- when x=a\b
- echo $x:ab
复制代码 |
|