14

インターフェイスのIPアドレスを取得ifconfigして後で読み取る変数を設定しようとしました。しかし、echoコマンドを実行すると、変数はまだ空です。私のコードを見てください:

/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}'); echo $HOST_IPS"

しかし、 /bin/echo は同じコマンドで問題なく動作します:

/usr/bin/bash -c "echo $(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}')"
4

3 に答える 3

16

$最後の echo コマンドで記号をエスケープする必要があります$HOST_IPS。そうしないと、サブシェルが生成される前に変数がコマンド文字列に代入されます。

/usr/bin/bash -c "HOST_IPS=$(/usr/bin/ifconfig | /usr/bin/awk 'BEGIN {cnt=0} {if($0 ~ /inet / && cnt==1) {print $2} cnt++}'); echo \$HOST_IPS"

より即時に可視化するには:

#                                                  v-- insert backslash here
/usr/bin/bash -c "HOST_IPS=$(same as before); echo \$HOST_IPS"

@gniourf_gniourf のコメントに反して、実際には他のドル記号をエスケープする必要はありません。ただし、書かれているように、コマンド置換はサブシェル (!) によって実行されません。その結果は、サブシェルに渡されるコマンド文字列に代入されます。呼び出し

mypid() { echo $$; }
bash -c "pid=$(mypid); echo \$pid; mypid"

mypid動作方法を示します。親シェルの PID を出力し、サブシェルが関数を認識していないため、既知のコマンドではないことを訴えます。

親シェルでコマンドを実行ifconfig | awkすることは問題にならない可能性が高いため、コマンド置換部分は変更しないでおくことができます。コマンドをサブシェルで実行することが重要な場合は、そこにあるものもすべてエスケープする必要があります。

于 2015-03-01T13:11:38.157 に答える
0

/usr/bin/bashサブシェルを開始します。シェルが終了すると、シェル内のすべての設定が失われます。
次のサブはサブシェルで設定され、エコーされる前に失われます。

/usr/bin/bash -c sub=1; echo $sub

サブシェルで変数を設定したい場合は、stdout を使用して値を転送します。

sub=$(/usr/bin/bash -c "echo 1"); echo $sub
于 2015-03-01T13:07:32.637 に答える