Linux中单引号和双引号在命令、文件名使用详解

前言

近期在公司做了一个需求,主要都是涉及shell脚本的修改和编写,发现自身对Linux中的单双引号的作用很不熟练,导致在一些嵌套使用单双引号的情景下发生了误用。为此,写一篇博客来从最基本的单层运用到嵌套运用的情景进行总结。

基本介绍和使用

单引号:

​ 单引号的作用会忽略所有的命令和特殊字符,让引号中的内容按字符串输出。

双引号:

​ 双引号中的内容,系统扫描其中的命令和特殊字符,让参数以实际的值进行输出。

例子:

​ 在该例子中,定义一个变量a,分别通过单引号和双引号进行输出,可以看到单引号下,以该变量的字面上的值进行输出,而双引号则是获取了该变量的实际值进行输出显示。

(C:\Users\WIN10\AppData\Roaming\Typora\typora-user-images\image-20211001102321722.png)]
在这里插入图片描述

文件名中的使用

首先提个问题,以下三种命名方式的文件,他们有什么区别?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

他们是一个文件还是三个文件呢?

答案是:三个文件!

注意

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 "$@"; docmd="$cmd \"$arg\""
done
eval $cmd

该例子是通过输入的参数进行解析并且执行,这里的参数是命令+文件名。例如:commit test.txt

而当我们的文件名中包含有空格,例如:commit test file.txt

那么,我们则需要用""将文件名全部包含进来,防止空格被命令隔断,即:“commit” “test file.txt”

所以,传进来的参数都要为"$arg",而因为最外层还有一层"",所以这里需要用转义字符"\",

即:\"$arg\"

总而言之,当我们要使用多层引号时,要注意判断是否为同一双引号或者同一单引号,根据语义来决定是否需要使用转义字符来将引号保留。

猜你喜欢

转载自blog.csdn.net/weixin_43896829/article/details/120575923