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

addr="192.168.0.111"echo"'$addr'"结果为'192.168.0.111'echo'"$addr"'结果为"$addr"这两个我还可以理解:1... 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
展开
 我来答
小白聊电子科技
高粉答主

2020-05-17 · 专注电子数码问题解答
小白聊电子科技
采纳数:775 获赞数:75458

向TA提问 私信TA
展开全部

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名称。

zhanghao_1986
推荐于2017-11-23 · 超过25用户采纳过TA的回答
知道小有建树答主
回答量:109
采纳率:0%
帮助的人:0
展开全部
echo ' " '$addr' " '="$addr" =addr的值
系统没那么聪明 他看到前面2个单引号就以为是一对了 他哪知道第一个和第4个才是一对
楼主真是人才 没事拿这引号来出气 整这么多引号
BTW:你得需求我愣是没看明白 可能是我领悟能力太差了吧 祝你学习顺利
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jiangtao9999
2010-03-27 · TA获得超过1.2万个赞
知道大有可为答主
回答量:1.2万
采纳率:44%
帮助的人:8174万
展开全部
建议你看看 bash 的源代码,我觉得可能他只支持两层的引号调用。
之后因为你的三层引号,导致 bash 处理出现问题了吧?

我觉得可能会是:
引号显示部分只处理到第二级引号,后面被忽略。
变量处理实现部分是一直处理过来,所以三级引号导致前面两部都有双引号,使得引号处理代码认为只有两级,但因为一直处理过来,所以前面只要遇到双引号,就会 mask 一个 bash 变量,认为以双引号开始。之后处理所有变量。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
防尘一男
2018-05-10
知道答主
回答量:2
采纳率:0%
帮助的人:1450
展开全部
echo '"'$addr'"' 结果是 "192.168.0.111"
单引号里面不能出现单引号,就算转义也不行,所以这个系统是echo |'"' | $addr |'"'|
变量前面的俩个单引号是一对,变量后面的是一对
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
委思07x
2010-03-27 · TA获得超过934个赞
知道小有建树答主
回答量:340
采纳率:0%
帮助的人:308万
展开全部
只要是在双引号里的变量$都能生效
没必要这么复杂,用\"和\'不就行了
编程时逻辑清晰性也很重要,让别人也能看懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式