请教Linux shell命令中双引号与单引号嵌套的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教Linux shell命令中双引号与单引号嵌套的问题相关的知识,希望对你有一定的参考价值。

addr="192.168.0.111"

echo "'$addr'" 结果为 '192.168.0.111'
echo '"$addr"' 结果为 "$addr"
这两个我还可以理解:
1) 双引号内的单引号功能被关闭,反之亦然。
2) 双引号内的$功能被保留,单引号内的$功能被关闭。

再多一层嵌套我就晕啦:
echo '"'$addr'"' 结果是 "192.168.0.111"
echo "'"$addr"'" 结果是 '192.168.0.111'
第二个问题不大,主要是第一个,里面的双引号和单引号功能均被关闭,最外面是单引号,为什么$还生效了呢?

自己想了半天没绕出来,求指教。
这里的引号看不大清楚,加上空格分隔开来便于区分(实际是没有的),上面的例子依次为:
echo " '$addr' "
echo ' "$addr" '

echo ' " '$addr' " '
echo " ' "$addr" ' "

实例是这样的:
ipAddr=' " '$addr' " '
column1='$1'
awkStr="/test2/sub($column1,$ipAddr) print"
awk "$awkStr" /etc/test > /tmp/backup

其中,/etc/test的内容是:
127.0.0.1 test1
192.168.1.4 test2
10.0.0.31 test3

在下想通把上面那几行命令合成一行awk命令,可惜不成,求高人出手。
-----------------------------------------------------------------
想到了并且试过了,以下两种皆可:
awk '/test2/sub($1," '$addr' ") print' /etc/test > /tmp/backup
awk "/test2/sub(\$1,\"$addr\") print" /etc/teset > /tmp/backup

1、首先在Linux系统中,使用echo $ 0来显示如下输出。

2、查看Linux系统上可用的所有shell,文件/ etc / shells中列出了Linux系统上可用的所有shell。 可以使用cat命令或更少的命令来查看文件的内容。

3、更改shell以使用另一个shell,要使用其他shell,只需输入其名称即可登录新shell。 

4、永久更改Linux中的默认Shell,Linux允许您使用chsh命令更改默认Shell。 为您自己的登录用户更改默认Shell的最佳方法是,使用-s选项指定/ etc / shells文件中列出的Shell名称。

参考技术A echo ' " '$addr' " '="$addr" =addr的值
系统没那么聪明 他看到前面2个单引号就以为是一对了 他哪知道第一个和第4个才是一对
楼主真是人才 没事拿这引号来出气 整这么多引号
BTW:你得需求我愣是没看明白 可能是我领悟能力太差了吧 祝你学习顺利本回答被提问者采纳
参考技术B 建议你看看 bash 的源代码,我觉得可能他只支持两层的引号调用。
之后因为你的三层引号,导致 bash 处理出现问题了吧?

我觉得可能会是:
引号显示部分只处理到第二级引号,后面被忽略。
变量处理实现部分是一直处理过来,所以三级引号导致前面两部都有双引号,使得引号处理代码认为只有两级,但因为一直处理过来,所以前面只要遇到双引号,就会 mask 一个 bash 变量,认为以双引号开始。之后处理所有变量。
参考技术C echo '"'$addr'"' 结果是 "192.168.0.111"
单引号里面不能出现单引号,就算转义也不行,所以这个系统是echo |'"' | $addr |'"'|
变量前面的俩个单引号是一对,变量后面的是一对
参考技术D 只要是在双引号里的变量$都能生效
没必要这么复杂,用\"和\'不就行了
编程时逻辑清晰性也很重要,让别人也能看懂

linux shell中单引号双引号和没有引号的区别

单引号:

可以说是所见即所得:即将单引号的内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。

双引号:

把双引号内的内容输出出来:如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容。

双引号内命令或变量的写法为`命令或变量`或$(命令或变量)。

无引号:

把内容输出出来,可能不会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容,如果字符串中带有空格等特殊字符,则不能完整输出,需要加双引号,一般连续的字符串,数字,路径等可以用,不过最好用双引号代替。

以上是关于请教Linux shell命令中双引号与单引号嵌套的问题的主要内容,如果未能解决你的问题,请参考以下文章

Linux Shell 中的反引号,单引号,双引号

bash中双引号单引号反撇号的用法

请教jsonJSON.parse中双引号如何解决

shell 脚本中双引号 单引号 反引号 的区别

shell脚本中单引号和双引号的区别

shell中对于单引号,双引号和反引号的处理方式