请教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 展开
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 展开
5个回答
展开全部
echo ' " '$addr' " '="$addr" =addr的值
系统没那么聪明 他看到前面2个单引号就以为是一对了 他哪知道第一个和第4个才是一对
楼主真是人才 没事拿这引号来出气 整这么多引号
BTW:你得需求我愣是没看明白 可能是我领悟能力太差了吧 祝你学习顺利
系统没那么聪明 他看到前面2个单引号就以为是一对了 他哪知道第一个和第4个才是一对
楼主真是人才 没事拿这引号来出气 整这么多引号
BTW:你得需求我愣是没看明白 可能是我领悟能力太差了吧 祝你学习顺利
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议你看看 bash 的源代码,我觉得可能他只支持两层的引号调用。
之后因为你的三层引号,导致 bash 处理出现问题了吧?
我觉得可能会是:
引号显示部分只处理到第二级引号,后面被忽略。
变量处理实现部分是一直处理过来,所以三级引号导致前面两部都有双引号,使得引号处理代码认为只有两级,但因为一直处理过来,所以前面只要遇到双引号,就会 mask 一个 bash 变量,认为以双引号开始。之后处理所有变量。
之后因为你的三层引号,导致 bash 处理出现问题了吧?
我觉得可能会是:
引号显示部分只处理到第二级引号,后面被忽略。
变量处理实现部分是一直处理过来,所以三级引号导致前面两部都有双引号,使得引号处理代码认为只有两级,但因为一直处理过来,所以前面只要遇到双引号,就会 mask 一个 bash 变量,认为以双引号开始。之后处理所有变量。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
echo '"'$addr'"' 结果是 "192.168.0.111"
单引号里面不能出现单引号,就算转义也不行,所以这个系统是echo |'"' | $addr |'"'|
变量前面的俩个单引号是一对,变量后面的是一对
单引号里面不能出现单引号,就算转义也不行,所以这个系统是echo |'"' | $addr |'"'|
变量前面的俩个单引号是一对,变量后面的是一对
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只要是在双引号里的变量$都能生效
没必要这么复杂,用\"和\'不就行了
编程时逻辑清晰性也很重要,让别人也能看懂
没必要这么复杂,用\"和\'不就行了
编程时逻辑清晰性也很重要,让别人也能看懂
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询