Skip to content

条件判断

if基础结构

if后面可以跟任意数量的命令。这时,所有命令都会执行,但是判断真伪只看最后一个命令,即使前面所有命令都失败,只要最后一个命令返回0,就会执行then的部分

  • then单独一行时不需要分号
shell
#!/bin/bash
if commands; then
  commands
[elif commands; then
  commands...]
[else
  commands]
fi

示例

shell
#!/bin/bash

echo -n "输入一个1到3之间的数字(包含两端)> "
read character
if [ "$character" = "1" ]; then
    echo 1
elif [ "$character" = "2" ]; then
    echo 2
elif [ "$character" = "3" ]; then
    echo 3
else
    echo 输入不符合要求
fi

case结构

用于多值判断,可以为每个值指定对应的命令,跟包含多个elif的if结构等价,语义更好

shell
#!/bin/bash

echo -n "输入一个1到3之间的数字(包含两端)> "
read character
case $character in
  1 ) echo 1
    ;;
  2 ) echo 2
    ;;
  3 ) echo 3
    ;;
  * ) echo 输入不符合要求  # 通配符可以匹配其他字符和没有输入字符的情况
esac

test 命令

test命令执行成功(返回值为0);表达式为伪,test命令执行失败(返回值为1)

语法结构

js
// 写法一
test expression

// 写法二
[ expression ]

// 写法三
[[ expression ]] // 支持正则

例子:判断文件(夹)是否存在

shell
#! /bin/bash

if test -e /tmp/foo.txt ; then
  echo "Found foo.txt"
fi

文件(夹)判断

[ -a file ]:如果 file 存在,则为true【同 [ -e file ]

[ -d file ]:如果 file 存在并且是一个目录,则为true

[ -r file ]:如果 file 存在并且可读(当前用户有可读权限),则为true

[ -w file ]:如果 file 存在并且可写(当前用户拥有可写权限),则为true

[ -x file ]:如果 file 存在并且可执行(有效用户有执行/搜索权限),则为true

示例

shell
#! /bin/bash

FILE=~/.bashrc

if [ -e "$FILE" ]; then
  if [ -d "$FILE" ]; then
    echo "$FILE is a directory."
  fi
  if [ -r "$FILE" ]; then
    echo "$FILE is readable."
  fi
  if [ -w "$FILE" ]; then
    echo "$FILE is writable."
  fi
  if [ -x "$FILE" ]; then
    echo "$FILE is executable."
  fi
else
  echo "$FILE does not exist"
  exit 1
fi

WARNING

上面代码中,$FILE要放在双引号之中,这样可以防止变量**$FILE为空,从而出错。因为$FILE如果为空,这时[ -e $FILE ]就变成[ -e ],这会被判断为真。而$FILE**放在双引号之中,[ -e "$FILE" ]就变成[ -e "" ],这会被判断为伪

字符串判断

[ string ]:如果string不为空(长度大于0),则判断为真

[ string1 = string2 ]:如果string1和string2相同,则判断为真【等价于: [ string1 == string2 ]

[ string1 != string2 ]:如果string1和string2不相同,则判断为真

整数判断

[ integer1 -eq integer2 ]:如果integer1等于integer2,则为true。

[ integer1 -ne integer2 ]:如果integer1不等于integer2,则为true。

[ integer1 -le integer2 ]:如果integer1小于或等于integer2,则为true。

[ integer1 -lt integer2 ]:如果integer1小于integer2,则为true。

[ integer1 -ge integer2 ]:如果integer1大于或等于integer2,则为true。

[ integer1 -gt integer2 ]:如果integer1大于integer2,则为true。

参考