第二章 shell分支语句

if/then/elif/else/fi

和C语言类似,在Shell中用if、then、elif、else、fi这几条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命令组成的。

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

解释:如果[  -f ~/.bashrc ]为真,执行then后面的语句,也就是执行 . ~/.bashrc语句。fi为结束语,为if的结束标志。如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了。

if [ -f /bin/bash ]
then echo "/bin/bash is a file"
else echo "/bin/bash is NOT a file"
fi
if :; then echo "always true"; fi

:是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真。

解释:如果[ -f /bin/bash ] 为真,这执行then后面的语句。也就是执行echo "/bin/bash is a file",否则执行echo "/bin/bash is NOT a file"这条语句。fi表示if分支执行完毕。

如果then后面语句太长回车即可。只要在else之前都是可以的。

注意在shell中 0为真,1为假。

#! /bin/sh

    echo "Is it morning? Please answer yes or no."
    read YES_OR_NO
    if [ "$YES_OR_NO" = "yes" ]; then
      echo "Good morning!"
    elif [ "$YES_OR_NO" = "no" ]; then
      echo "Good afternoon!"
    else
      echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
      exit 1
    fi
    exit 0

read命令的作用是等待用户输入一行字符串,将该字符串存到一个Shell变量中。

case/esac

case命令可类比C语言的switch/case语句,esac表示case语句块的结束。C语言的case只能匹配整型或字符型常量表达式,而Shell脚本的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。

    #! /bin/sh

    echo "Is it morning? Please answer yes or no."
    read YES_OR_NO
    case "$YES_OR_NO" in
    yes|y|Yes|YES) //这是匹配的值,符合这个条件执行下面的语句。执行完直接跳出。
      echo "Good Morning!";;
    [nN]*)        //这是匹配的值,符合这个条件执行下面的语句。执行完直接跳出。
      echo "Good Afternoon!";;
    *)            //这是匹配的值,符合这个条件执行下面的语句。执行完直接跳出。
      echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
      exit 1;;
    esac
    exit 0

解释:

输入yes或者no或者其他。;;相当于c语言的break。shell中#是注释的意思。

猜你喜欢

转载自blog.csdn.net/m0_38036750/article/details/81487951