近期在公司做了一个需求,主要都是涉及shell脚本的修改和编写,发现自身对Linux中的单双引号的作用很不熟练,导致在一些嵌套使用单双引号的情景下发生了误用。为此,写一篇博客来从最基本的单层运用到嵌套运用的情景进行总结。
单引号:
单引号的作用会忽略所有的命令和特殊字符,让引号中的内容按字符串输出。
双引号:
双引号中的内容,系统扫描其中的命令和特殊字符,让参数以实际的值进行输出。
例子:
在该例子中,定义一个变量a,分别通过单引号和双引号进行输出,可以看到单引号下,以该变量的字面上的值进行输出,而双引号则是获取了该变量的实际值进行输出显示。
首先提个问题,以下三种命名方式的文件,他们有什么区别?
他们是一个文件还是三个文件呢?
答案是:三个文件!
注意
1.虽然文件名中有双引号或者单引号,但是这些文件并不是同一个文件,想要使用命令编辑,修改文件,也不能直接 vi “test.txt”/vi ‘test.txt’,因为这样修改的是test.txt文件。如果要对这些文件进行操作,则要使用vi “‘test.txt’”(双嵌套单,操作’test.txt’)或者vi ‘“test.txt”’(单嵌套双,操作"test.txt")或者使用转义字符"\"。
2.切记不能使用单嵌套单或者双嵌套双,否则,这样操作的文件还是test.txt
了解了单双引号的基本用法后,接着来讲嵌套使用
例子:
cmd="" for arg in "$@"; do cmd="$cmd \"$arg\"" done eval $cmd
该例子是通过输入的参数进行解析并且执行,这里的参数是命令+文件名。例如:commit test.txt
而当我们的文件名中包含有空格,例如:commit test file.txt
那么,我们则需要用""将文件名全部包含进来,防止空格被命令隔断,即:“commit” “test file.txt”
所以,传进来的参数都要为"$arg",而因为最外层还有一层"",所以这里需要用转义字符"\",
即:\"$arg\"
总而言之,当我们要使用多层引号时,要注意判断是否为同一双引号或者同一单引号,根据语义来决定是否需要使用转义字符来将引号保留。