0

私はシェルスクリプトについて学び始めたばかりで、このスクリプトで何が起こっているのかを調べようとしています: http://dev.cloudtrax.com/wiki/ng-cs-ip-logging

具体的には、"\$foo"たとえば次のようないくつかの行に頭を悩ませることはできません。

[ -z "\$plug_event" ] && return

シェル スクリプトについて読んで学んだことはすべて"\$plug_event"、値が である文字列として評価されると信じています$plug_event。これは、上記のテストが常にa を返すことを意味し1ます (つまり、テストは false でした)。もしそうなら、ポイントは何ですか?

変数を引用符で囲むことはたくさんありますが、これまでのところ、この種の使用例を 1 つも見つけることができませんでした。ただのタイプミスですか?残念ながら、私はまだ違いを見分けるのに十分な経験がありません。

すべてのヘルプは非常に高く評価されており、関連ドキュメントへのリンクで十分です。

乾杯、カイル

4

2 に答える 2

2

$すべてのsをエスケープする理由は、これらの行がヒアドキュメントの一部であるためです

このコマンドは、ヒットするまでcat > /etc/ip_logging.sh << EOF次のすべてのテキストを に出力します。現在のスクリプトで変数を評価しないようにするには、をエスケープする必要があります。/etc/ip_logging.shEOF$

または、コードを読みやすくするために、終了文字列を一重引用符で囲むと、ヒアドキュメントの変数置換が無効になります。

cat > /etc/ip_logging.sh << 'EOF'
    [ -z "$plug_event" ]
    #other stuff
EOF

エスケープ$された他のシェル特殊文字を除いて、同じ結果になります

于 2013-05-23T17:05:35.530 に答える
0

テスト:

[ -z "\$plug_event" ]

無意味です。文字列の長さがゼロになることはありません。実行されなかった後のリターン。

そのコードを書いた人は、自分が何をしているのか理解していませんでした...特別に扱われるヒアドキュメントの一部であるなどの酌量すべき状況がない限り。

しかし、それだけでは、その発言は無意味です。

...コードを見て...

# create iptables script on the fly
cat > /etc/ip_logging.sh << EOF
#!/bin/sh

. /etc/functions.sh

install_rule() {
        config_get plug_event "\$1" plug_event

        [ -z "\$plug_event" ] && return

        pub_ip=\$(uci get dhcp.pub.ipaddr)
        pub_mask=\$(uci get dhcp.pub.netmask)

        priv_ip=\$(uci get dhcp.priv.ipaddr)
        priv_mask=\$(uci get dhcp.priv.netmask)

        iptables -I POSTROUTING -t nat -o br-\$1 -s \$pub_ip/\$pub_mask -j LOG --log-level debug --log-prefix "iplog: "
        iptables -I POSTROUTING -t nat -o br-\$1 -s \$priv_ip/\$priv_mask -j LOG --log-level debug --log-prefix "iplog: "
}

config_load network
config_foreach install_rule interface
EOF

誰かが何をしようとしているのか多かれ少なかれ知っていました。彼らはヒアドキュメントでスクリプトを書いており、生成されたスクリプトが作成されたときではなく、実行されたときにパラメータを展開する必要があります。以下を使用することで、生活を簡素化できた可能性があります。

# create iptables script on the fly
cat > /etc/ip_logging.sh << 'EOF'

終了マーカーの周りの引用符は、ヒアドキュメントで展開が行われないことを意味するため、すべてのバックスラッシュを使用できます。

bash マニュアルはあなたの友達です。 シェル パラメーターの展開は関連するセクションの 1 つですが、抑制された展開ではなく、実際の展開について説明します。

于 2013-05-23T17:05:17.177 に答える