条件一出shell不服

Wednesday, March 25, 2020

if 最常用的条件

if [ 条件测试 ]
then
    做这个
fi

fi意思是if语句结束。then是"那么"的意思。
“做这个"只有在"条件测试"为真时,才会执行。
注意:if 后边的 [] 中的“条件测试”两边必须要空格。

另一种写法:

if [ 条件测试 ];then
    做这个
fi

例子:

#!/bin/bash
name='william'
if [ $name = 'william' ]
then
    echo "hello $name"
fi

shell中,”等于“使用一个=表示的,用==表示等于的判断也可以。

else 否则

若“如果”的判断条件不成立,那么“否则” else

if [ 条件测试 ]
then
    做这个
else
    做那个
fi

例:

#!/bin/bash
name1='abc'
name2='def'
if [ $name1 = $name2 ]
then
    echo "the same name"
else
    echo "different name"
fi

elif 否则,如果

elif是 else if 的缩写,表示“否则 - 如果”

if [ 条件测试1 ]
then
    做事情1
elif [ 条件测试2 ]
then
    做事情2
elif [ 条件测试3 ]
    做事情3
else
    做事情4
fi

例:

#/bin/bash
if [ $1 = 'a' ]
then
    echo "hello a"
elif [ $1 = 'b' ]
then
    echo "hello b"
elif [ $1 = 'c' ]
then
    echo "hello c"
elif [ $1 = 'd' ]
then
    echo "hello d"
else
    echo "sorry,i don not know you"
fi

可以写任意多个elif,但是if有且只能有一个,else不一定要有且最多只能有一个。
可以有if...else...组成的,也可以有if...elif...else...组成的,还可以有if..elif..组成的。

条件测试

不同的测试类型

在bash中可以做三种测试:测试字符串,测试数字,测试文件。

测试字符串

$string1 = $string2 两个字符串是否相等。shell大小写敏感,A和a不一样
$string1 != $string2 两个字符串是否不同
-z $string 字符串string是否为空,z是zero的首字母
-n $string 字符串string是否不为空。n是not的首字母

例:

#!/bin/bash
if [ -z $1 ]
then
    echo "no parameter"
else
    echo "the parameter is $1"
fi
测试数字

shell把所有变量都看成是字符串,但还是可以做数字的条件测试。
$num1 -eq $num2 两个数字是否相等,和判断字符串所用的符号=不一样,eq是equal的缩写,“等于”的意思。
$num1 -ne $num2 两个数字是否不同,ne 是 not equal 的缩写。
$num1 -lt $num2 数字num1是否小于num2,lt 是 lower than 的缩写
$num1 -le $num2 数字num1是否小于或等于num2,le是 lower or equal 的缩写
$num1 -gt $num2 数字num1是否大于num2,gt 是 greater than 的缩写
$num1 -ge $num2 数字num1是否大于或等于num2,ge 是 greater or equal 的缩写

例:

#!/bin/bash
if [ $1 -ge 10 ]
then
    echo "greater than 10 or equal to 10"
else
    echo "lower than 10"
fi
测试文件

-e $file 文件是否存在,e 是exist
-d $file 文件是否是一个目录,Linux一切都是文件,目录也是文件的一种,d 是directory
-f $file 文件是否是一个文件,f是file
-L $file 文件是否是一个符号链接文件,L 是link
-r $file 文件是否可读,r 是readable
-w $file 文件是否可写,w 是writable
-x $file 文件是否可执行,x 是executable
$file1 -nt $file2 file1是否比file2新,nt 是newer than
$file1 -ot $file2 file1是否比file2旧,ot 是older than

例:

#!/bin/bash
read -p 'enter a directory:' file
if [ -d $file ]
then
    echo "$file is a directory"
else
    echo "$file is not a directory"
fi
一次测试多个条件

在一个条件测试中,可以同时测试多个条件。
&& 表示逻辑与,符号两端条件必须全为真,整个才为真,有一个不为真,整个为假
|| 表示逻辑或,符号两端条件只需有一个为真,整个为真,只有当两个都为假时,整个才是假的

例:

#!/bin/bash
if [ $# -ge 1 ] && [ $1 = 'love' ]
then
    echo "great"
else
    echo "terrible"
fi

在做多个条件的判断时,按照从左到右的顺序判断,若前一个测试条件决定了整个测试条件的结果,那么后一个的条件旧不会被判断。

反转测试

可以用“否定”来反转测试条件,用 ! 感叹号。

例:

#!/bin/bash
read -p 'enter a file :' file
if [ ! -e $file ]
then
    echo "$file does not exist"
else
    echo "$file exists"
fi

! -e $file 表示“如果文件file不存在”

case 测试多个条件

#/bin/bash
if [ $1 = 'a' ]
then
    echo "hello a"
elif [ $1 = 'b' ]
then
    echo "hello b"
elif [ $1 = 'c' ]
then
    echo "hello c"
elif [ $1 = 'd' ]
then
    echo "hello d"
else
    echo "sorry,i don not know you"
fi

上边对同一个变量做测试,可以改写成:

#!/bin/bash
case $1 in
    "a")
        echo "Hello a !"
        ;;
    "b")
        echo "Hello b !"
        ;;
    "c")
        echo "Hello c !"
        ;;
    "d")
        echo "Hello d !"
        ;;
    *)
        echo "Sorry, I do not know you."
        ;;
esac

case $1 in : $1 表示我们要测试的变量是输入的第一个参数,in 表示 “在……之中”的意思。
"a" : 测试其中一个case,$1是否等于“a”。也可以用通配符来匹配多个字符,例如 "a*") 可以匹配所有以a开头的字符串。
;; : 类似于其他编程语言中的“break”,表示结束case的读取,程序跳转到esac后面执行。
esac : 是case反写,表示case语句结束。

case语句相当于其他编程语言中的switch语句。

也可以在case语句的匹配项中做“或”的匹配:

#!/bin/bash
case $1 in
    "dog" | "cat" | "pig")
        echo "it is a mammal"
        ;;
    "pigeon" | "swallow")
        echo "it is a bird"
        ;;
    *)
        echo "do not konw what it is"
        ;;
esac
LinuxShell

循环往复shell开路

变量在手shell不愁

comments powered by Disqus