3 回答

TA貢獻1776條經(jīng)驗 獲得超12個贊
經(jīng)典技術(轉(zhuǎn)義元字符):
if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi
我已經(jīng)$g用雙引號將引用括起來;一般來說,這是一個好習慣。嚴格來說,并不需要括號,因為的優(yōu)先級-a,并-o使得它糾正,甚至沒有他們。
請注意,-aand -o運算符是testaka 的POSIX規(guī)范的一部分[,主要是為了向后兼容(例如,因為它們是test7th Edition UNIX 的一部分),但是POSIX將它們明確標記為“過時”。Bash(請參閱條件表達式)似乎搶先了經(jīng)典和POSIX的含義,-a并-o帶有自己的接受參數(shù)的替代運算符。
一定要小心,您可以使用更現(xiàn)代的[[運算符,但是請注意,例如Bash和Korn Shell中的版本不必相同。
for g in 1 2 3
do
for c in 123 456 789
do
if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
then echo "g = $g; c = $c; true"
else echo "g = $g; c = $c; false"
fi
done
done
在Mac OS X上使用Bash 3.2.57運行示例:
g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false
您不需要像使用引號一樣引用變量[[,[因為它不是以相同的方式[是單獨的命令。
這不是一個經(jīng)典的問題嗎?
我會這么想的。但是,還有另一種選擇,即:
if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi
的確,如果您閱讀了該autoconf工具或相關軟件包的“便攜式外殼”指南,則建議使用“ ||”和“ &&” 這種符號。我想您甚至可以做到:
if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi
在動作像回聲一樣瑣碎的情況下,這還不錯。當要重復的動作塊為多行時,重復會很痛苦,并且較早的版本之一是可取的-否則您需要將動作包裝到在不同then塊中調(diào)用的函數(shù)中。

TA貢獻1799條經(jīng)驗 獲得超8個贊
使用/bin/bash以下方法將起作用:
if [ "$option" = "Y" ] || [ "$option" = "y" ]; then
echo "Entered $option"
fi
- 3 回答
- 0 關注
- 6546 瀏覽
添加回答
舉報