確認されたIPアドレスを変数に割り当てようとしています。
ip=$(ping -q -c1 -W1 google.com | grep -Eo "([0-9]+\.?){4}" | head -n 1) | echo $ip
または
ip=`resolveip google.com | head -n 1` | echo $ip
両方のエコーは空の出力を返します。このコマンドは変数に代入しなくても正常に動作します。私は何が間違っていましたか?
答え1
$ip
達成したいのは、コマンドの内容をシェル変数に割り当てた後に出力するようですping
。最初コマンド出力を変数に代入し、それからコンソールに結果変数の内容を印刷します。
ただし、パイプ(|
)演算子を使用して2つのコマンドを連結しています。これは2つの理由で無効な演算子です。
- まず、この演算子は、あるコマンドの出力を別のコマンドの入力にリダイレクトするために使用されます。ただし、変数の割り当ては出力を生成せず、コマンドはから
echo
変更されませんstdin
。|
演算子を使用すると、より複雑な状況では問題が発生する可能性があります。 - より深刻な点(観察された動作の実際の原因である可能性があります)は、これらのパイプラインの両端のコマンドが同時に開始され、受信コマンドが送信コマンドの出力を「即時」処理できることです。 (特に、出力全体をバッファリングする必要はありません)。あなたの場合、これは
echo $ip
シェルに時間がある間にコマンドがすぐに実行されることを意味しますping
。
したがって、2つの問題に対する解決策は、;
reverseを使用して同じ行にのみ書かれた2つのコマンドを順番に実行することです。
ip=$(ping -q -c1 -W1 google.com | grep -Eo "([0-9]+\.?){4}" | head -n 1) ; echo $ip