我編寫了一個腳本,它解析文件並根據文件中的固定寬度設定變數。
然後我想檢查每個變量,如果它是空白字段,則設置為“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
等於1
和3
。如果您想要進行四次迭代,且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
注意
- 之前和之後必須有空格
[
, - 之前和之後必須有空格
=
, - 前面必須有空格
]
(如果後面還有其他內容,後面也必須有空格),而且 fi
是if
倒寫的。
但你的問題標題提到「未設定變數」。
two
並且four
是放到一個空白字串;
five
和six
(和orange
、pumpkin
、tiger
以及其他潛在變數名稱的準無限列表)是未設定。有差別。如果那是你感興趣的,你需要問一個不同的問題,因為,如果你這樣做
for num in "$one" "$two" "$three" "$four" "$five" "$six" "$orange" "$pumpkin" "$tiger"
do
︙
那麼將無法區分five
、six
、orange
、
pumpkin
、 和tiger
、 迭代與two
和four
迭代 —
num
在所有七種情況下都將被設定為空白字串。您需要直接測試$four
和$five
(等)變數。
PS 不要問新問題;進行搜尋。這個問題之前已經回答過。