Linux Shell——条件判断语句

Linux Shell

使用test 内建函数

test命令是 shell 环境中用于测试条件表达式的工具。
它的返回值可以是 true,false,0或1。基本语法为:

test EXPRESSION

如果大家需要多个表达式,可以使用ANDOR,对应的选项为-a-o

test EXPRESSION -a EXPRESSION
test EXPRESSION -o EXPRESSION

其实,在实际应用中,test 有种非常简洁的方式,就是被中括号包含的条件表达式。这种方式更加常用。语法如下:

[ EXPRESION ]

test 的用法很多,例如,可以比较两个字符串是否相等:

[ $USER = root ]

大家还可以test 的选项来判断一个字符串的长度是否为0。

[ -z $1 ]

上面的代码的含义是,如果没有参数输入的话,返回 true。

test 还可以用来比较数字的大小。例如:

[ $# -gt 0 ]

除此而外,还可以判断文件的类型。例如,大家想查找类型为符号链接的文件,然后删除。可以使用如下脚本:

# [ -h $HOME/bin ] &&rm $HOME/bin

其他常用的选项如下:

  • -d:文件是否为目录
  • -e:文件是否存在
  • -x:文件是否可以实行
  • -f:文件是否为常规文件
  • -r:文件是否可读
  • -p:文件是否为命名管道
  • -b:文件是否为块设备文件
  • -c:文件是否为字符设备文件

使用 if 条件判断语句

if 语句的基本格式为:

if conditon ; then
    statement 1
    statement 2
fi

大家可以看一个具体的例子:

#!/bin/bash
if [ $# -lt 1 ] ; then
    echo "Usage: $0 <name>"
    exit 1
fi

echo "Hello $1"

exit 0

在运行此脚本时,如果没有输入参数,则提示正确的使用方法,非正常退出;否则,打印输入的参数,程序正常退出。

if 语句还可以使用 else 条件分支。具体的语法为:

if conditon ; then
    statement
else
    statement
fi

大家新建一个脚本文件 hello6.sh,来展示 if else 的用法。

#!/bin/bash
if [ $# -lt 1 ] ; then
    read -p "Enter a name: "
    name=$REPLY
else
    name=$1
fi

echo "Hello $name"

exit 0

当没有输入参数时,程序提示需要输入一个 name;如果输入了的话,就会打印出来。

最后一种 if 的情况,也是最完整的 if 条件语句。语法如下;

if condition; then
    statement
elif condition; then
    statement
else
    statement
fi

再举个例子,新建脚本 backup2.sh,大家使用 tar 命令来备份压缩指定的目录,根据输入的参数“H”,“M”,“L”,可以实行不同的压缩级别。

如果输入的参数为“H”,则使用 bzip2的压缩方式;

如果输入的参数为“M”,则使用 gzip 的压缩方式;

如果输入的参数为“L”,则使用 tar 命令对文件打包,不压缩。

#!/bin/bash
# this sciprt dirs’ location are defualt under $HOME

read -p "Choose H, M or L compression " file_compression
read -p "Which directory do you want to backup to " dir_name
read -p "Which directory do you went to backup: " tobe_backup_name

# The next lines creates the directory if it does not exist
test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name
backup_dir=$HOME/$dir_name

tar_l="-cvf  $backup_dir/b.tar $HOME/$tobe_backup_name"
tar_m="-czvf $backup_dir/b.tar.gz $HOME/$tobe_backup_name"
tar_h="-cjvf $backup_dir/b.tar.bzip2 $HOME/$tobe_backup_name"

if [ $file_compression = "L" ] ; then
    tar_opt=$tar_l
elif [ $file_compression = "M" ]; then
    tar_opt=$tar_m
else
    tar_opt=$tar_h
fi

tar $tar_opt

exit 0

使用 case 选择语句

如果 if else 分支太多的话,可以考虑使用 case 语句,case 语句提供了更加简洁的机制。
case 语句的语法结构为:

case expression in
    case1) 
        statement1
        statement2
    ;;
    case2)
        statement1
        statement2
   ;;
   *)
       statement1
   ;;
esac

还是举个简单的例子,新建脚本文件 grade.sh。

#!/bin/bash
# Script to evaluate grades
# Usage: grade.sh studentName grade

if [ ! $# -eq2 ] ; then
    echo "You must provide <studentName> <grade>
    exit 2
fi

case $2 in
    [A-C]|[a-c]) 
        echo "$1 is a star pupil"
    ;;
    [Dd]) 
        echo "$1 needs to try a little harder!"
    ;;
    [E-F]|[e-f]) 
        echo "$1 could do a lot better next year"
    ;;
    *) 
        echo "Grade could not be evaluated for $1"
esac

exit 0

运行结果如下:

grade

推荐阅读更多精彩内容