Shell

分配的變數具有來自 nslookup 和 ping 命令的空輸出

  • January 21, 2022

我正在嘗試將解析的 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

引用自:https://unix.stackexchange.com/questions/687298