目录

Shell 条件与分支

条件判断

  1. 数字的判断
[ int1 -eq int2 ] 两数相等为真
[ int1 -ne int2 ] 两数不等为真
[ int1 -gt int2 ] int1大于int2为真
[ int1 -ge int2 ] int1大于等于int2为真
[ int1 -lt int2 ] int1小于int2为真
[ int1 -le int2 ] int1小于等于int2为真
  1. 文件的判断
[ -r file ] 用户可读为真
[ -w file ] 用户可写为真
[ -x file ] 用户可执行为真
[ -f file ] 文件为正规文件为真
[ -d file ] 文件为目录为真 ,即检测目录是否存在。
[ -c file ] 文件为字符设备文件为真
[ -b file ] 文件为块设备文件为真
[ -s file ] 文件大小非0时为真
[ -t file ] 当文件描述符(默认为1)指定的设备为终端时为真
[ -e file ] 如果文件存在,则为真。
[ -L file ] 如果文件为符号链接, 则为真。
  1. 逻辑判断
[ condition -a condition ] 与
[ condition -o condition ] 或
[ condition ! condition ]  非
  1. 字符串判断

字符串的比较,最好使用双中括号

1. 判断字符串相等
    [[ "$str1" = "$str2" ]]  或者  [[ "$str1" == "$str2" ]]
    上面两种方式具备相同的功能

    [[ "$str" == a* ]]      模式匹配, 如果字符串以a开头,则条件为true
    [[ "$str" == "a*" ]]    如果字符串和"a*"相等,则条件为true
    [ "$str" == a* ]        file globbing(文件通配)
        此时的a*会自动匹配到当前以a开头的文件
        如果str=ab.txt,并且当前目录中存在ab.txt这个文件,那么上面的条件将会满足
    [ "$str" == "a*" ]      如果字符串和"a*"相等,则条件为true
    
2. 判断字符串不相等
    [[ "$str1" != "$str2" ]]

3. 判断字符串不为空,长度大于0
    [ -n "$str1" ]
 
4. 判断字符串为空.就是长度为0.
    [ -z "$str1" ]

test命令

基本格式: test expression test命令返回真(0)或者假(1)

test命令可以理解的表达式类型分为4类 * 表达式判断 * 字符串比较 * 数字比较 * 文件比较

例如: if test $var -eq 0 等价于 if [ $var -eq 0 ]

分支与循环

if条件

格式如下:

if condition; then
    commands
fi

if condition; then
    commands
elif condition; then
    commands
else
    commands
fi

使用逻辑运算符简化语句

[ condition ] && action     如果condition为真,则执行action
[ condition ] || action     如果condition为假,则执行action

Case语句

适用于需要进行多重分支的应用情况。 格式如下:

case  $变量名  in
    模式1 )
        命令序列1
        ;;
    模式2 )
        命令序列2
        ;;  
    *)
        默认执行的命令序列      
        ;;  
esac  

case行尾必须为单词“in”,每一个模式必须以右括号“)”结束. 双分号;;表示示命令序列结束. 匹配模式:

  可以使用方括号表示一个连续的范围,如[0-9];
  竖杠符号`|`表示或.
  `*)` 表示默认模式,当使用前面的各种模式均无法匹配该变量时,默认模式的命令序列.

for循环

格式如下:

for var in word1 word2 ……
do
    command
    command
    ……
done

例:

#!/bin/sh
for i in {1..10}
do
echo $i
done

注意: 大括号与数字之间不能有空格,上面的脚本i从1到10,中间使用2个点表示, 数字与点之间不能有空格

While循环

格式如下:

while condition
do
    command
    command
    ……
done

例:

#!/bin/sh
while [ $# -ne 0 ]
do
echo $1
shift
done

shift使位置变量下移,使$1=$2,$2=$3,最后$#还要减少1,也就是说把第一个参数删除了