1

数字の配列があります - sipPeers

その配列を繰り返し処理し、各値をコマンドに渡したい

asterisk -rx "sip show peer 1234"- 1234 は明らかに拡張子です。

の出力sip show peerはパイプ処理され、2 回操作されて、2 番目の配列に格納する 1 つの値が出力されますsipUserAgent

temp="asterisk -rx \"sip show peer "${sipPeers[q]}"\" | grep Useragent |  awk \'{print$3}\'" #(1)
echo $temp #(2)
sipUserAgent[q]=$($temp) #(3)

1 回の反復の出力は、構築されたコマンドを文字列として生成し (2)、実行を試みます (3)。

asterisk -rx "sip show peer 564" | grep Useragent | awk '{print }'
No such command '"sip' (type 'core show help sip' for other possible commands)

echo'd コマンドをコピーして貼り付けると実行されますが、スクリプトを実行するとそのエラーが発生します。スクリプトがそれを実行すると、どこかで"文字の意味が変わりますか?

4

3 に答える 3

3

コマンドを実行する前に、コマンドを変数に格納しようとしないでください。これを行うにはあらゆる種類の問題があり、それらのいくつかに遭遇しています(BashFAQ#50:コマンドを変数に入れようとしていますが、複雑なケースは常に失敗します!)。$( ... )パイプラインをそれが属する場所の中に直接置くだけです:

sipUserAgent[q]=$(asterisk -rx "sip show peer ${sipPeers[q]}" | grep Useragent |  awk '{print $3}')
于 2013-03-07T11:43:14.250 に答える
1

第1の問題

ステップ (1) では、次のように記述します。awk \'{print$3}\'

(2) の出力では、以下を受け取ります。awk '{print }'

問題は、逃したエスケープです$3

awk \'{print\$3}\'(1) でもう一度お試しください

2番目の問題

sipUserAgent[q]=$($temp)コマンドを呼び出そうとしますasterisk_-rx...

これは確かにあなたが望むものではありません。解決策は使用することですeval- 詳細については、を参照help evalしてください。

cmd="echo TEST"
$(${cmd})

与えます:

テスト: コマンドが見つかりません

cmd="echo TEST"
eval ${cmd}

与えます:

テスト

コードスタイルに関する注意

可能であれば、複雑なコマンドの作成と実行を避ける方がよいでしょうeval。該当する場合は、より単純なコードを作成することをお勧めします。したがって、使用する必要があります(別の回答でGordon Davissonによっても言及されているように):

sipUserAgent[q]=$(asterisk -rx "sip show peer ${sipPeers[q]}" \
 | grep Useragent \
 |  awk '{print $3}' \
)    
于 2013-03-07T11:00:21.520 に答える
0

コマンド置換中に引用符をエスケープする方法はわかりませんが、回避策はを使用することevalです。次の例を参照してください。

$ cat test.sh 
echo "$1"
$ temp="./test.sh \"2 34 434\" "
$ echo "$temp"
./test.sh "2 34 434"
$ result=$(eval $temp)
$ echo "$result"
2 34 434
$ result=$($temp)
$ echo "$result"
"2

eval使用を回避できる場合、ほとんどの状況で使用は一般的に悪い習慣と見なされることに注意してください。

于 2013-03-07T11:19:54.797 に答える