Shell
分配的變數具有來自 nslookup 和 ping 命令的空輸出
我正在嘗試將解析的 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
兩個迴聲都返回空輸出。不將其分配給變數命令效果很好。我做錯了什麼?
您想要實現的似乎是在將命令
$ip
的輸出分配給它之後輸出shell變數的內容ping
- 這意味著您要首先將命令輸出分配給一個變數,然後在控制台上列印結果變數內容。但是,您正在使用管道 (
|
) 運算符來連結這兩個命令。這是錯誤的運算符,原因有兩個。
- 首先,該運算符用於將命令的輸出重定向到另一個命令的輸入;但是變數賦值不會產生輸出,並且
echo
命令不會從stdin
. 雖然這不是問題的根本原因,但|
在以這種非預期方式使用運算符時,您可能會在更複雜的情況下遇到問題。- 更嚴重(並且可能是觀察到的行為的實際原因),這種管道兩端的命令同時啟動,以便接收命令可以“當它來”處理來自發送命令的輸出(特別是,不需要緩衝整個輸出)。在您的情況下,這意味著該
echo $ip
命令會立即執行,並且可能在 shell 有時間用ping
.因此,這兩個問題的解決方案是使用 the
;
來簡單地順序執行兩個恰好寫在同一行的命令:ip=$(ping -q -c1 -W1 google.com | grep -Eo "([0-9]+\.?){4}" | head -n 1) ; echo $ip