基础语法

条件判断

shell 的判断有两种写法,分别是 [[[,举个例子,下面两种写法都是正确的:

abc="1"
if [[ $abc = "1" ]]; then
    echo "equal"
fi

# 或者
if [ $abc = "1" ]; then
    echo "equal"
fi

虽然两者看起来很类似,但 [ 很早就有了,它的本质是调用内置的 test 指令,而 [[ 的诞生则相对晚的多,它是 bash/zsh 的语法。

在实际开发中,两者的细节差异较大,对初学者非常不友好,我的建议是统一使用 [[

shell 中的判断可以分为数字比较、字符串比较和文件判断等几大类。

数字判断

判断两个数字相等有三种写法:单等号、双等号或 -eq 关键字:

[[ $abc = 1 ]] && echo "yes" || echo "not"
[[ $abc == 1 ]] && echo "yes" || echo "not"
# 或者 
[[ $abc -eq 1 ]] && echo "yes" || echo "not"
# 输出结果都是 yes

不等号可以用 !=-ne 表示,大于号可以用 > 或者 -gt 来表示,小于号用 < 或者 -lt 表示。这几个英文单词不必记忆。

但 shell 不支持 “大于等于”、“小于等于”这些判断,前者用 -ge 表示,后者用 -le 表示。

字符串判断

字符串的判等和数字一致,不同的是可以判断字符串是否为空:

str="" 
# 未定义和长度为零的字符串都算空字符串
[[ -z $str ]] && echo "yes" || echo "not" # 输出 yes
[[ -n $str ]] && echo "yes" || echo "not" # 输出 not

字符串还支持模式匹配:

str="hello"
[[ $str == he* ]] && echo "yes" || echo "not"
# 模式匹配,以 he 开头的单词都能匹配,hello 满足要求,所以输出 yes

文件判断

文件判断有以下几种:

  1. if [[ -e file ]]判断是否存在,不限制类型
  2. if [[ -f file ]]判断文件是否存在,必须是普通类型的文件,不能是文件夹
  3. if [[ -d file ]]判断文件夹是否存在,必须是文件夹,不能是文件

逻辑运算符

其它语言的几种逻辑运算符可以正常使用:

[[ ! $str == h*lo || 1 = 1 ]] && echo "yes" || echo "not"
# 第一个判断取反,结果为 false,但第二个判断为 true,所以最终效果是输出 yes

[[ $str == h*lo && 1 = 2 ]] && echo "yes" || echo "not"
# 第二个判断为 false,所以输出 not

if 语句

完成的 if 语句如下:

if [[ expression_1 ]]; then
   echo "condition 1"
elif [[ expression_2 ]]; then
   echo "condition 2"
else
   echo "condition else"
fi

其中 elifelse 语句都是可省略的,因此最简单的 if 语句是:

if [[ expression_1 ]]; then
   echo "condition 1"
fi

循环

for 循环的语法和 if 比较类似:

for f in `ls`; do
    echo $f
done

results matching ""

    No results matching ""