[英]Bash. Why "while" statement with incorrect condition works?
while ['qwe'='rty']
do
echo yes
done
條件顯然不正確,但終端無限期地打印“是”。 為什么會這樣?
條件明顯不對...
不,它真的不是(1) 。
bash
的條件(包括通過(2)將[
和]
字符與條件分隔開的“命令”空格)中需要空格,以便將條件解釋為三部分測試。
您提供的內容(假設上述缺少的命令空格是一個簡單的拼寫錯誤)被視為單部分測試,只要它不是空字符串,它就是正確的。
你可以看到下面的區別:
pax> [ 'abc' = 'xyz' ] && echo yes
pax> [ 'abc' = 'xyz' ] || echo no
no
pax> [ 'abc'='xyz' ] && echo yes
yes
bash
手冊頁的相關部分有這個(注意相等檢查中的空格,它們不僅僅是用於在手冊頁本身中分隔標記):
string
-n string
如果字符串的長度不為零,則為真。
string1 == string2
string1 = string2
如果字符串相等則為真。
=
應與 POSIX 一致性test
命令一起使用。
換句話說,你應該擁有的while
語句是:
while [ 'qwe' = 'rty' ]
(1)好吧,從技術上講,這是不正確的,但不是你的意思(錯誤)。 相反,它是不正確的,因為它不是您認為的表達方式:-)
(2)如果沒有這些命令空格,您將看到如下語法錯誤:
pax> ['abc' = 'xyz'] && echo yes
[abc: command not found
pax> ['abc'='xyz'] && echo yes
[abc=xyz]: command not found
當然,除非您實際上有一個名為[abc=xyz]
的可執行目標,在這種情況下它將被執行並且返回值將決定采取什么行動。 這是一個不太可能的可執行目標,但它是可能的:
pax> echo true > '[abc=xyx]' ; PATH=$PATH:.
pax> ['abc'='xyx'] && echo yes
yes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.