Bash:IF和ELSE,比较和逻辑OR门?

时间:2016-03-14 20:05:52

标签: linux bash scripting

我目前正在从外部硬盘驱动器运行Archlinux,因此我尝试在bash中创建一个脚本,这样我就可以更换视频驱动程序而无需在每次从另一台计算机启动时浏览配置文件。

我在台式机上使用 nvidia nouveau ,但在我女朋友的笔记本电脑上使用英特尔。因此,我一直在使用SED创建一个bash脚本,它将当前使用的驱动程序输出到名为 $ VCARD 的变量,而我想要更改的那个将是脚本的第一个参数( $ 1 ,然后)。

我的问题是,我正在尝试使这个安全,以便我不会意外地将包含nvidia,nouveau或intel的字符串交换到不是这三个字符串的任何内容。我认为最好的方法是进行一系列if-else比较,如下所示。

 awk ... -v fname="$f" '{...; print fname... etc

当你想要适应中间的逻辑或门时,条件如何工作?

PD:是的,我使用'#'作为sed命令的分隔符,我希望这不是任何人的眼睛。

4 个答案:

答案 0 :(得分:4)

此外:

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

答案 1 :(得分:2)

您有两种可能的方法。

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

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

就个人而言,我更喜欢第二种。它与其他编程语言所采用的方式更接近,并且可以被更广泛的程序员理解。

修改:感谢@Etan Reisner提供的有用评论。在决定选择哪个选项时,应该考虑到这一点。

答案 2 :(得分: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

答案 3 :(得分:0)

尝试:

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