2016-03-14 99 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

不错!我更新了片段。 –