如何在单引号包围的awk语句中使用单引号?

时间:2012-07-09 23:31:21

标签: linux bash awk hp-ux

我在编写脚本需要的awk语句时遇到问题:

rsh fooDNS '
    ...

    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |  awk '{print \$6}')
    ...
'

这里的问题是上面的语句包含在由单引号括起来的rsh命令中。因此,bash无法解释{print $ 6}周围的单引号,这给我带来了很多问题。到目前为止,我还未能确定如何解决这个问题。

4 个答案:

答案 0 :(得分:7)

您无法嵌套单引号,但您可以结束单引号字符串,包含转义的单引号,然后重新输入引号。试试这个:

rsh fooDNS '
    ...

    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |  awk '\''{print $6}'\'')
    ...
'

尽管如此,这种引用疯狂很快就会变得难看。如果可能的话,我建议使用scp / rcp / ftp将普通的bash脚本复制到远程,然后运行它。如果不这样做,我认为你可以使用这样的技巧,如果你不需要向脚本的stdin提供任何东西:

cat script_file | rsh fooDNS bash

(如果您的脚本是普通的,则使用rsh fooDNS /bin/sh - sh - 兼容,而远程端当然没有bash。)

作为另一种选择,如果你的代码片段很短,你可以在这里使用docs:

rsh fooDNS sh <<'EOF'
    ...
    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |  awk '{print $6}')
    ...
EOF

答案 1 :(得分:2)

每次用序列'\''替换嵌入的单引号。从理论上讲,你可以做到:

rsh fooDNS '
    ...
    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |
    awk '\''{print $6}'\'')
    ...
'

第一个'结束当前单引号字符串; \'序列添加单引号;最后的'重新启动一个新的(但连续的)单引号字符串。所以,这不会引入空格或任何东西。

另一方面,最好避免这样做。重新解释字符串时很容易导致问题。在处理远程shell时,情况就更是如此。

答案 2 :(得分:1)

我手动操作时通常使用双引号进行深度嵌套,或者自动混合使用双引号和单引号。

如果您手动执行此操作,则可能更简单的方法是使用反斜杠转义嵌套的双引号,撇号和美元符号,并避免执行超过一个或两个级别的深度。

有时候,我不会手动嵌套引号,而是使用: http://stromberg.dnsalias.org/~strombrg/bashquote.html 它可以自动地,指数地包装带双引号的字符串。它使用双引号和单引号的混合。

EG。从最小的代码测试:

dstromberg@zareason-limbo6000a ~/src/home-svn/bashquote/trunk $ ./bashquote.py
unquoted: 'This is a test'
repetition 0: ''"'"'This is a test'"'"''
repetition 1: ''"'"''"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"''"'"''
repetition 2: ''"'"''"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"''"'"''
Final version: ''"'"''"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"''"'"''
''"'"''"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'This is a test'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"''"'"'"'"'"'"'"'"''"'"''

这应该适合跳过3个ssh并在4日执行。

答案 3 :(得分:1)

对于AWK脚本,我将变量设置为八进制等效值。

但是在像你这样的情况下,我会使用双引号并确保逃避shell可能解释的所有内容,例如你所做的美元符号。

我不会使用rsh,因为它不安全。