測試 for 迴圈中未設定的變數

測試 for 迴圈中未設定的變數

我編寫了一個腳本,它解析文件並根據文件中的固定寬度設定變數。

然後我想檢查每個變量,如果它是空白字段,則設置為“0”。一個簡單的變體是:

one=1  
two=""  
three=3  
four=""  

for num in $one $two $three $four  
do  
   echo num is $num  
done

給我一個輸出:

num is 1   
num is 3

我想做的是編寫if $two is null then two=0.

我怎樣才能做到這一點?

答案1

您需要 -z 比較運算符 http://tldp.org/LDP/abs/html/comparison-ops.html

if [ -z $two ]; then   ## or [ -z $num ] to test them all 
    two=0
fi
echo "num is $num"

答案2

你的問題沒有太大意義。首先,如果你說

one=1
two=""
three=3
four=""

for num in $one $two $three $four
do

那麼該for語句被解釋為

for num in 1  3

因此只有兩次迭代,num等於13。如果您想要進行四次迭代,且num等於1、(null)3和 (null),那麼您需要說

for num in "$one" "$two" "$three" "$four"

您應該引用 shell 變數引用,除非您有充分的理由不這樣做,並且您確定您知道自己在做什麼。

所以,

for num in "$one" "$two" "$three" "$four"
do
    echo "num is $num"
done

將導致

num is 1
num is 
num is 3
num is 

現在,如果您希望結果為1, 0, 3, 0,只需簡單地說

for num in "$one" "$two" "$three" "$four"
do
    if [ "$num" = "" ]
    then
        num=0
    fi
    echo "num is $num"
done

注意

  • 之前和之後必須有空格[
  • 之前和之後必須有空格=
  • 前面必須有空格] (如果後面還有其他內容,後面也必須有空格),而且
  • fiif倒寫的。

但你的問題標題提到「未設定變數」。  two並且four到一個空白字串; fivesix(和orangepumpkintiger以及其他潛在變數名稱的準無限列表)是未設定。有差別。如果是你感興趣的,你需要問一個不同的問題,因為,如果你這樣做

for num in "$one" "$two" "$three" "$four" "$five" "$six" "$orange" "$pumpkin" "$tiger"
do

那麼將無法區分fivesixorangepumpkin、 和tiger、 迭代與twofour迭代 — num在所有七種情況下都將被設定為空白字串。您需要直接測試$four$five(等)變數。

PS 不要問新問題;進行搜尋。這個問題之前已經回答過。

相關內容