我们在Linux命令中经常会用到引号,比如处理文件名中的空格,或者处理特殊字符的时候。本文将解释不同类型的引号及其在shell脚本中的用法。综上所述,引号大致有四种:单引号:'双引号:"反斜杠:\反引号:`除了反斜杠,其他三种都是成对出现的,下面我们来详细了解一下。1.单引号shell会忽略单引号内的所有特殊字符,里面的所有内容都会被当做一个元素,我们举个例子,如果有一个文本文件,里面记录了一些名字,$catcricketAllanDonald,SouthAfricaSteveWaugh,AustraliaMarkWaugh,AustraliaHenryOlonga,ZimbabweSachinTendulkar,India现在我们用grep命令在里面搜索“Waugh”,得到两个结果:$grepWaughcricketSteveWaugh,AustraliaMarkWaugh,Australia但是如果我们更精确一点,搜索SteveWaugh,会出现错误:$grepSteveWaughcricketgrep:Waugh:Nosuchfileordirectorycricket:SteveWaugh,Australia为什么会出现这种情况呢?因为空格是用来分隔命令的,操作tions和命令行参数。在上面的例子中,我们本来想搜索SteveWaugh,但是shell会将Steve作为grep的第一个参数,然后将Waugh和cricket作为要搜索的文件。很明显,没有Waugh文件,所以报错。同时,文件cricket的输出结果如图所示。如果我们使用单引号来搜索'SteveWaugh',它会被当作一个整体来对待,所以我们得到了我们期望的搜索结果:$grep'SteveWaugh'cricketSteveWaugh,Australia基本上,当shell看到第一个单引号时,它会忽略任何特殊字符(空格也是特殊字符),直到找到另一个单引号(右引号)。如果用单引号括起来,则忽略所有特殊字符,所有特殊字符都失去其原始含义。下面我们举几个例子。我们在shell中声明一个变量,如果我们用$回显变量名,它将显示变量的值:$var=my_variable$echo$varmy_variable但如果用单引号括起来,$将失去其特殊功能。$echo'$var'$var又如,回车键(carriagereturncharacter)也放在单引号内:$echo'howareyou?'howareyou?2.双引号双引号几乎与单引号相似。我在这里说“几乎”是因为它们也忽略了所有特殊字符,除了:但是单引号不能这样做:$var=my_variable$echo"echo'var双引号也可以用来在shell中对单引号进行转义(即,将它们转义为普通字符):$var=My'ownvilla'isyellowownvilla:commandnotfound$var="My'ownvilla'isyellow"$echo$varMy'ownvilla'isyellow可以反向使用(用单引号转义双引号),或者:$var=hesaid,"Awesome!said,:commandnotfound$var='hesaid,"Awesome!"'$echo$varhesaid,"Awesome!"3.反斜杠反斜杠用于转义特殊字符,见下例:$var=variable$echo\varvar$echo$varvariable$echo\$var$vara因为v没有特殊含义,echo\var只是打印var。另一方面,当使用$var时,反斜杠转义了$符号,所以$varEscapingnewlineswithbackslashes我们可以使用反斜杠来转义换行,这样我们就可以将单个命令换行继续写,当命令太长或者是多个命令的组合时,你会看到一些网站使用反斜杠在多行中显示单个命令。这可以使命令或代码更具可读性。请参见以下示例:dockerrun--nameserver--networknet-vhtml:/usr/share/nginx/html-v$PWD/custom-config.conf:/etc/nginx/nginx.conf-p80:80--restarton-failure-dnginx:latest现在我们使用反斜杠,将上面的命令分成多行:dockerrun--nameserver--networknet\-vhtml:/usr/share/nginx/html\-v$PWD/custom-config.conf:/etc/nginx/nginx.conf\-p80:80--restarton-failure-dnginx:latest这看起来容易多了。双引号内的反斜杠在双引号内,/(反斜杠)、$(美元符号)和`(反引号)是三个未转义的符号。这样,我们就可以使用反斜杠来转义美元符号、双引号和双引号中的反引号。看下面的例子,其中$5会被认为是一个未声明的变量,没有被赋值,所以在echo命令中会被忽略:$echo"Mealcosts$5.25"Mealcosts.25为避免上述情况,您可以使用\转义$$echo"Mealcosts\$5.25"Mealcosts$5.254。反引号反引号(`)具有特殊含义,用于命令替换。Shell具有此命令替换功能,其中指定的命令将替换为命令的输出。在下面的例子中,date将被date命令的输出替换,即系统当前的日期和时间:$echoThecurrentdateandtimeisdateThecurrentdateandtimeisMonday23August202104:55:18PMIST需要注意的是,只有在反引号之间有命令时,才会进行替换,否则显示为原来的内容:$echo'当前日期和时间是late'当前日期时间晚了上面说了,如果把反引号放在双引号里,不会转义,但是如果放在单引号里,对于普通字符会转义.不再推荐使用反引号很长一段时间以来,反引号一直被用于shell脚本中的命令替换,但是现在,现代Unix和Linux系统倾向于使用$(command)结构,例如:$echoThecurrentdateandtimeis$(date)当前日期和时间是Monday23August202105:55:47PMIST因此,不再使用反引号。以上就是本次分享的全部内容,欢迎讨论。
