awk 引号与变量问题 求详解

echo'aaa'|awk'{print"mytest"}'c=''ddff'echo'aaa'|awk'{print"'"$c"'"}'//放大"'"$c"'"想问下为... echo 'aaa' | awk '{ print "my test" }'
c=''dd ff'
echo 'aaa' | awk '{ print "'"$c"'" }' //放大 " ' " $c " ' "

想问下为什么awk打印字符串my test 需要双引号“my test”
awk引用shell变量的时候" ' " $c " ' " 需要这么多引号

现在书本/网站讲的不明不白 引号问题上面老出错
展开
 我来答
kwydwuf
2013-01-30 · TA获得超过7410个赞
知道大有可为答主
回答量:1527
采纳率:71%
帮助的人:2006万
展开全部
你的问题实际上牵扯到 awk 和 bash 中对引号的处理。
先说 "为什么awk打印字符串my test 需要双引号“my test”
awk 打印字符串,字符串必须用双引号括起来。 如果不扩,比如 awk '{print my test}', awk 会认为你是要打印变量 my 和 test 的值。 比如
echo 'aaa' | awk '{my=12; test=13; print my test}'
你会得到
1213

然后再说 echo 'aaa' | awk '{ print "'"$c"'" }' //放大 " ' " $c " ' "

这里,用 单引号将整个 awk 命令括起来,这个没什么问题。 由于你要 awk 打印的是 bash 变量 c 的内容, 如果直接 awk '{print "$c"}', 由于 $c 是在单引号中,bash不会将 $c 替换成其值,相当于让 awk 直接打印字符串 $c。

为了能够既保证 awk print 语句后面的字符串被 双引号抱起来,又让 $c 被bash替换成 c 的值,你的命令里才会出现那么多引号,并将awk命令分成了好几个部分,

第一部分, '{print "' ; 即 {print 以及要打印字符串的左边的双引号
第二部分, "$c"; 由于是双引号,所以bash会将 $c 替换成 c 的值
第三部分, '"}' ; 即 print 要打印的字符串的右边的双引号和括号

这三部分连起来就构成了了完整的 awk 命令。

但是,我认为可以有更易读的方法来解决你这个问题,比如利用 bash 的 eval
cmd="echo 'aaa' | awk '{print \"$c\"}'"
eval $cmd

或者用双引号将awk命令括起来
echo 'aaa' | awk "{print \"$c\"}"
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式