4

我在实现脚本所需的这个 awk 语句时遇到问题:

rsh fooDNS '
    ...

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

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

4

4 回答 4

7

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

rsh fooDNS '
    ...

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

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

cat script_file | rsh fooDNS bash

(当然,rsh fooDNS /bin/sh如果您的脚本是纯sh兼容的并且远程端没有 bash,则使用该脚本。)

作为另一种选择,如果您的代码段很短,您可以在此处使用文档:

rsh fooDNS sh <<'EOF'
    ...
    BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast |  awk '{print $6}')
    ...
EOF
于 2012-07-09T23:52:24.833 回答
3

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

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

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

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

于 2012-07-09T23:55:45.590 回答
1

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

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

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

例如。从代码的最小测试:

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 日执行应该是有好处的。

于 2012-07-10T00:32:26.493 回答
1

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

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

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

于 2012-07-10T00:49:44.073 回答