2016-03-14 102 views
0

我目前從外部硬盤驅動器上運行的Archlinux,所以我試圖讓一個腳本在bash,讓我改變視頻驅動程序,而無需通過配置文件瀏覽每次我從另一臺計算機的啓動時間。Bash:IF和ELSE,比較和邏輯OR門?

我用NVIDIA暴發戶在我的臺式電腦,但英特爾當我在我的女朋友的筆記本電腦。因此,我一直在與SED一個bash腳本,將輸出電流驅動器被用於一個名爲$ VCARD變量,而我想換到一個將是腳本($ 1第一個參數,然後)。

我的問題是,我想使這個安全的,這樣我就不會意外地交換了持有NVIDIA,暴發戶或英特爾東西,這不是這三根弦的弦。我認爲最好的做法是進行一系列if-else比較,如下所示。

if [ "$1" = "$VCARD" ] 
then 
    echo "Already using $VCARD driver." 
else 
    if [ "$1" = "nouveau" or "intel" or "nvidia" ] #This is the line that concerns me. 
    then 
     sed -i -e "7s#\(nouveau\|intel\|nvidia\)#$1#" /etc/X11/xorg.conf.d/10-monitor.conf 
     echo "New driver is now $1." 
    else 
     echo "You don't want to put that string there. (try nouveau, intel or nvidia)" 
    fi 
fi 

當你想適應中間的邏輯或門時條件是如何工作的?

PD:是的,我使用「#」 S作爲分隔符的sed命令,我希望這不是任何人的眼中釘。

+0

''||是邏輯或許多其他編程語言 – karakfa

+1

使用帶'[]正規'test' ''不適用於'||'和'&&'。爲了使用這些,你需要'[['和']]'。在單個方括號內,可以使用'-a'作爲AND,'-o'作爲OR。 – Filkolev

+0

洋蔥頭,您的示例直到我爲該代碼添加了雙括號後才適用於我。不過,非常感謝我指出了正確的方向! –

回答

2

你有兩種可能的方法。

一: if [ "$1" = "nouveau" -o "$1" = "intel" -o "$1" = "nvidia" ]

二: if [[ "$1" = "nouveau" || "$1" = "intel" || "$1" = "nvidia" ]]

就個人而言,我寧願第二。它更接近於其他編程語言所使用的內容,並且可以被更廣泛的程序員理解。

編輯:感謝@Etan Reisner的有用評論。在決定選擇哪個選項時,應該真正考慮到這一點。

+0

既此又mikebridge的解決方案完美地工作。感謝您指出雙括號問題和解決方案! –

+4

不推薦'-o'這裏的解決方案,因爲它已被棄用,是歷史上的支持很差。 '[[||] ]]'和'[] || []'版本雖然不錯。單支架版本更加便攜,雙支架版本更加安全(根據報價需求)並具有不同的行爲。 –

0

嘗試:

if [ "$1" = "intel" -o "$1" = "nouveau" -o "$1" = "nvidia" ]; 
+0

此解決方案也可以運行,並感謝您提交它!雖然我不認爲最後的分號是必要的:P –

4

另外:

if [ "$1" = "nouveau"] || [ "$1" = "intel" ] || ["$1" == "nvidia" ] 
+0

這個完美的作品!非常感謝。 –

1

您可以使用case

case "$1" in 
    "$VCARD") 
     echo "Already using $VCARD driver." 
     ;; 
    nouveau|intel|nvidia) 
     sed -i -e "7s#\(nouveau\|intel\|nvidia\)#$1#" /etc/X11/xorg.conf.d/10-monitor.conf 
     echo "New driver is now $1." 
     ;; 
    *) 
     echo "You don't want to put that string there. (try nouveau, intel or nvidia)" 
     ;; 
esac 
+0

我還沒有很好地學習如何處理案例,但是當我看到它時我會保存這個例子。非常感謝! –

+1

如果您將所有內容放在'case'中,包括第一次測試,可以進一步簡化。只需添加如下另一個選項:'$ VCARD) echo「已經使用$ VCARD驅動程序。」 ;;' – Filkolev

+0

不錯!我更新了片段。 –