我在编写脚本需要的awk语句时遇到问题:
rsh fooDNS '
...
BROADCAST_IP_ADDRESS=$(/usr/sbin/ifconfig $IF_NAME | grep broadcast | awk '{print \$6}')
...
'
这里的问题是上面的语句包含在由单引号括起来的rsh命令中。因此,bash无法解释{print $ 6}周围的单引号,这给我带来了很多问题。到目前为止,我还未能确定如何解决这个问题。
答案 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
,因为它不安全。