2012-09-21 71 views
1

我是而不是尋找一種不同的方式來完成明顯的意圖。我期待瞭解爲什麼這確切語法不起作用。bash if邏輯布爾字符串

[[email protected] ~]# while true;do 
> echo "Would you like the script to check the second box ([y]n)?" 
> read ans 
>   if [ "$ans" == "n" ];then 
>     echo 
>     echo "bye" 
>     exit 
>   elif [ "$ans" != "" -o "$ans" != "y" ];then 
>     echo "Invalid entry..." 
>   else 
>     break 
>   fi 
> done 
Would you like the script to check the second box ([y]n)? **"Should have continued"** 

Invalid entry... 
Would you like the script to check the second box ([y]n)? **"Should have continued"** 
y 
Invalid entry... 
Would you like the script to check the second box ([y]n)? **"Correct behavior"** 
alskjfasldasdjf 
Invalid entry... 
Would you like the script to check the second box ([y]n)? **"Correct behavior"** 
n 

bye 

這裏有一個參考資料,與我發現的其他人相同。我瞭解它在做什麼,它使用非邏輯的AND和OR,當我讀過的所有東西都說它應該使用邏輯布爾值。

http://www.groupsrv.com/linux/about140851.html

好了,所以這裏是,與豪爾的建議表現如何我原本就預計:

[[email protected] ~]# while true;do 
> echo "Would you like the script to check the second box ([y]n)?" 
> read ans 
>   if [ "$ans" = "n" ];then 
>     echo 
>     echo "bye!" 
>     exit 
>   elif [ "$ans" != "" -a "$ans" != "y" ];then 
>     echo "Invalid entry..." 
>   else 
>     break 
>   fi 
> done 
Would you like the script to check the second box ([y]n)? 
asdfad 
Invalid entry... 
Would you like the script to check the second box ([y]n)? 

[[email protected] ~]# while true;do 
> echo "Would you like the script to check the second box ([y]n)?" 
> read ans 
>   if [ "$ans" = "n" ];then 
>     echo 
>     echo "bye!" 
>     exit 
>   elif [ "$ans" != "" -a "$ans" != "y" ];then 
>     echo "Invalid entry..." 
>   else 
>     break 
>   fi 
> done 
Would you like the script to check the second box ([y]n)? 
y 
[[email protected] ~]# while true;do 
> echo "Would you like the script to check the second box ([y]n)?" 
> read ans 
>   if [ "$ans" = "n" ];then 
>     echo 
>     echo "bye!" 
>     exit 
>   elif [ "$ans" != "" -a "$ans" != "y" ];then 
>     echo "Invalid entry..." 
>   else 
>     break 
>   fi 
> done 
Would you like the script to check the second box ([y]n)? 
n 

logout 
+0

BTW,''==是一個錯誤,是可悲的bash所接受。只有'='是POSIX測試平等的方法。 – Jens

回答

1

問題在於:[「$ ans」!=「」-o「$ ans」!=「y」]總是如此,因爲or和否定。 $ ans不能等於「」和「y」。

嘗試更換這些線路

if [ "$ans" == "n" ];then 
elif [ "$ans" != "" -o "$ans" != "y" ];then 

這些

if [ "$ans" = "n" ];then 
elif [ "$ans" != "" -a "$ans" != "y" ];then 

或這些

if [[ $ans == n ]];then 
elif [[ $ans != "" && $ans != y ]];then 

越容易做的是一個案例:

case $ans in 
    y) echo "yes" 
    ;; 
    n) echo "no" 
    ;; 
    *) 
    ;; 
esac 

break只能在forwhile循環中使用,或者在select中使用,但它在您的文章中缺失。

+0

感謝大家的快速回復。在我的帖子中使用的-o例子只是95858943737495048似乎徒勞無益的嘗試之一。 我剛剛嘗試了Nahuel的建議,上帝和上帝工作!現在,我只需要unerstand。 我的邏輯如下: – user30772

+1

不要忘記接受答案 –

+0

我的邏輯如下: 問問題([y],n)並設計出最有效的方法來正確處理任何類型的可能的用戶輸入。 因此,如果用戶按「n」 - 退出scritp 如果用戶按下「vi45 08noisdfgoh qer g08haergrh8」等顯示錯誤並提示重試。 3. 1和2只剩下y和「」作爲唯一剩下的擊鍵 – user30772

0

我真的不明白,你爲什麼在ELIF使用-o 。我會用「||」或「OR」運算符。如果在if中使用兩個條件,則應該使用double [[和]]。 所以,如果你使用:

elif [[ "$ans" != "" || "$ans" != "y" ]];then 

它工作正常。

+0

[「$ ans」!=「」-o「$ ans」!=「y」]始終爲真 –

0

邏輯上它也是一種有缺陷的做事方式。 首先在這種情況下使用案例是最好的,其次你要查找== n,然後說明它是否是空白或不等於是 - 所以儘管在理論上沒有第一個if語句,但它仍然會滿足第二個條件

肯定,以確保輸入的最合理的方式是100%會

if [ "$ans" == "n" ];then 
       echo 
       echo "bye" 
       exit 
     elif [ "$ans" == "y" ];then 
       echo Yes 
         break; 

     else 

       echo "Invalid entry... >$ans<" 
     fi 
+0

請不要擴散'=='錯誤。正確'測試'平等的唯一方法是'='。 – Jens

+0

我的邏輯如下:詢問問題([y],n)並設計最有效的方法來正確處理任何類型的可能的用戶輸入。因此: 1.如果用戶按「n」 - 退出撥動 2.如果用戶按下「vi45 08noisdfgoh qer g08haergrh8」等顯示錯誤並提示重試。 3. 1和2只剩下y和「」作爲剩下的唯一鍵擊 這個錯誤如何? – user30772

+0

它的缺陷是因爲你正在尋找一個是否,而你似乎是在處理其他任何事情,就像上面的例子那樣,它處理的是/沒有其他任何東西 - 上面給出的例子與使用case語句沒有任何區別n)某事y)某事*)錯誤 – Vahid