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スクリプトをリモートにコピーし、それを実行することをお勧めします。それができない場合は、スクリプトのstdinに何もフィードする必要がない場合は、次のようなトリックを使用できると思います。

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}'\'')
    ...
'

1'つ目は、現在の一重引用符で囲まれた文字列を終了します。\'シーケンスは一重引用符を追加します。final'は、新しい(ただし連続した)一重引用符で囲まれた文字列を再起動します。したがって、これはスペースなどを導入しません。

一方で、そうする必要はないようにするのが最善です。文字列を再解釈すると問題が発生しやすくなります。そして、これはリモートシェルを扱う場合に二重に当てはまります。

于 2012-07-09T23:55:45.590 に答える
1

AWK スクリプトの場合、変数を 8 進数に設定しました。

しかし、あなたのようなケースでは、二重引用符を使用し、ドル記号など、シェルによって解釈される可能性のあるすべてのものを確実にエスケープします。

rsh安全ではないので、私は使用しません。

于 2012-07-10T00:49:44.073 に答える
1

通常、手動で深いネストを行う場合は二重引用符を使用するか、二重引用符と単一引用符を自動的に組み合わせて使用​​します。

手動で行う場合は、ネストされた二重引用符、アポストロフィ、およびドル記号をバックスラッシュでエスケープし、1 つまたは 2 つのレベルを超えないようにする方がおそらく簡単です。

時々、手動で引用符をネストする代わりに、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 に答える