目录
一、条件测试结构
1.if/then结构支持以下形式:
If…fi
If…else…fi
If…elif…else…fi
2.if/then结构判断命令列表的退出状态码是否为0
2.1 if grep -q Bash file1 查看
2.2 if echo “Linux” | grep -q “$inu”
2.3 if test -z “$1”
2.4 if /usr/bin/test -z “$1”
2.5 id [ -z “$1” ] ([ 是个命令 ] 是 [ 是一命令)
2.6 if [[ $conditionl || $conditionl@ ]]
[root@server1 ~]# rpm -qf /usr/bin/test
coreutils-8.22-21.el7.x86_64
[root@server1 ~]# rpm -qf /usr/bin/[
coreutils-8.22-21.el7.x86_64
[root@server1 ~]# v1=1
[root@server1 ~]# v2=2
[root@server1 ~]# [ "$v1" -ne "$v2" ] && echo "Not equal" (-ne 不等于)
Not equal

二、 实例分析
1.条件测试结构 Test Construects
1.1 fi test condition -true 与 if [ condition-true ] 相同
if [ condition-true ]
then
command 1
command 2
…
else
command 1
command 2
…
fi
if [ -x “$filename” ] ; then
if : ; then echo “ok”; fi
1.2 [ … ]对格式有严格要求:
1.2.1 [ ]中每个组件都需要用空格符分隔
1.2.2 [ ]中的变量和常量最好都用双引号引起来
1.3 [[…]]结构比[…]结构更加通用
1.4 命令true至此的类型:
1.4.1 数值比较
1.4.2 字符串比较
1.4.3 文件比较
#!/bin/bash
# if命令还可以对命令进行测试,并是仅仅是中括号中的条件
#比较两个文件是否一样
date >testfile1.txt
date >testfile2.txe
if cmp testfile1.txt testfile2.txt &> /dev/null #抑制输出
then echo "Flies are indetical"
else echo "Flies are differ"
fi
#在grep中,很有用
if grep -q CST testfile1.txt
then echo "File contains at lease one occrence of CST"
fi
#复杂一些的
word=Linux
letter_swquence=inu
if echo "$word" | grep -q "$letter_sequence"
then
echo "$lteter_sequence found in $word"
else
echo "$lteter_sequence not found in $word"
fi
rm testfile[12].txt
exit 0

#!/bin/bash
# 0是真
echo "Ttesting \"0\""
if [ 0 ]
then
echo "0 is ture"
else
echo "0 is false"
fi
echo
# 1是真 !!!
echo "Testing \"1\""
if [ 1 ]
then
echo "1 is ture"
else
echo "1 is false"
fi
echo
# -1是真!!!
echo "Testing \"-1\""
if [ -1 ]
then
echo "-1 is ture"
else
echo "-1 is false"
fi
echo
# NULL是假
echo "Testing \"NULL\""
if [ ] # NULL 空状态
then
echo "NULL is ture"
else
echo "NULL is false"
fi
echo
#随意字符是真
echo "Testing \"sxz\""
if [ sxz ]
then
echo "Radom string is ture"
else
echo "Radom string is false"
fi
echo
# 未初始化的变量是假
echo "Testing \"\$UninitVar\""
if [ $UninitVar ]
# if [ -n $UninitVar ] #这样更加规范的写法
then
echo "UninitVar variable is ture"
else
echo "UninitVar variable is false"
fi
echo

三、文件测试与整数比较
1.文件测试符 File test operators
| -e | 文件存在 |
| -a | 与-e相同,已被“弃用”了 |
| -f | 表示是一个普通文件(并不是目录或者设备文件) |
| -s | 文件大小不为零 |
| -d | 表示这是一个目录 |
| -b | 表示这是一个块设备(软盘,光驱等) |
| -c | 表示这是一个字符设备(键盘,声卡等) |
| -p | 这个文件是个管道 |
| -h | 这是一个符号链接 |
| -L | 这是一个符号链接 |
| -s | 表示这是一个socket |
| -t | 文件(描述符)被关联到一个终端设备上 |
| -r | 当前用户是否具有可读权限 |
| -w | 当前用户是否具有可写权限 |
| -x | 当前用户是否具有可执行权限 |
| -g | Set-group-id(sgid)标记被设置到文件或目录上 |
| -u | Set-user-id(suid)标记被设置到文件上 |
| -k | 设置粘贴位 |
| -o | 当前用户是否是文件的用有者 |
| -G | 文件的group-id是否与当前用户 |
| -N | 从上一次被读取到现在为止,文件是否被修改过 |
| f1 -nt f2 | 文件f1比文件f2新 |
| f1 -ot f2 | 文件f1比文件f2旧 |
| f1 -ef f2 | 文件f1比文件f2是相同的硬链接 |
#!/bin/bash
# 检查文件是否存在
echo -e "Enter the name of the file : \c"
read file_name
if [ ! -f $file_name ]
then
:
else
echo "$file_name not exists"
fi
exit 0

2.整数比较操作符 Integer Comparison
2.1 在中括号中使用 square bracket
| -eq | equal | 等于 | if [ “$a” -eq “$b” ] |
| -ne | not equal | 不等于 | if [ “$a” -ne “$b” ] |
| -gt | greater than | 大于 | if [ “$a” -gt “$b” ] |
| -ge | greater then or equal | 大于等于 | if [ “$a” -ge “$b” ] |
| -lt | less then | 下于 | if [ “$a” -lt “$b” ] |
| -le | less than or equal | 下于等于 | if [ “$a” -le “$b” ] |
2.2 在双圆括号中使用 Double-Parenthess
| < | 下于 | if ((“$a” < “$b” )) |
| <= | 下于等于 | if ((“$a” < = “$b” )) |
| > | 大于 | if ((“$a” > “$b” )) |
| >= | 大于等于 | if ((“$a” >= “$b” )) |
3.字符串比较符 String Comparion
| 操作符 | 含义 | 示例 | 备注 |
| = | 等于 | if [ “$a” = “$b” ] | |
| == | 等于 | if [ “$a” == “$b” ] | 与=等价 |
| != | 不等于 | if [ “$a” != “$b” ] | |
| < | 小于 | if [ “$a” < “$b” ] if [“$a” \< “$b” | 在[ ]结构中的,需要被转义 |
| > | 大于 | if [ “$a” >“$b” ] if [ “$a” /> “$b” ] | 在[ ]结构中的,需要被转义 |
| -z | 长度为零 | if [ -z “$a” ] | 字符串长度为零 |
| -n | 长度不为零 | if [ -n “$a” ] | |
| str | 非空 | if [ $a] | 检查字符串str是否非空字符串 |
注:1.<和>,按照ASCII字进行排序
2.建议把字符串用双引号引用起来
#!/bin/bash
a=4
b=5
if [ "$a" -ne "$b" ]
then
echo "$a is not equal to $b"
echo "(arithmetic comparison)"
fi
echo
if [ "$a" != "$b" ]
then
echo [ "$a is not equal to $b" ]
echo "(string comparison)"
fi

#!/bin/bash
# 编程时,强烈建议对字符串引用起来!
# 本脚本进行验证
# 例1:-n 对未声明的变量,采用引用
if [ -n "$string1" ]
then
echo "$string1 \"string1\" is not null "
else
echo "$string1 \"string1\" is null "
fi
# 会输出:string1 "string1" is null
echo
#例2:-n对未声明的变量,没有引用
if [ -n $string2 ]
then
echo "$string2 \"string2\" is not null "
else
echo "$string2 \"string2\" is null "
fi
# 会输出:string1 "string1" is not null
echo
#例3:-n 变量引用,对未声明的变量,采用引用
if [ "$string3" ]
then
echo "$string \"string3\" is not null "
else
echo "$string \"string3\" is null "
fi
# 会输出:string "string3" is null
echo
#例4:-n 变量引用,对为声明的变量,没有引用
if [ $string4 ]
then
echo "$string \"string4\" is not null "
else
echo "$string \"string4\" is null "
fi
# 会输出:string4 "string4" is null
echo
#例5:变量引用,已声明并赋值的变量,采用引用
string5=Initialized
if [ "$string5" ]
then
echo "$string \"string5\" is not null "
else
echo "$string \"string5\" is null "
fi
# 会输出:string "string5" is not null
echo
#例6:变量引用,已声明并赋值的变量,不采用引用
string6=Initialized
if [ "$string6" ]
then
echo "$string \"string6\" is not null "
else
echo "$string \"string6\" is null "
fi
# 会输出:string "string6" is not null
echo
#例7:一个特殊的字符串,如果不进行引用
string7="a = b"
if [ $string7 ]
then
echo "$string \"string7\" is not null "
else
echo "$string \"string7\" is null "
fi
# 会输出:string "string7" is null
echo
exit 0

#!/bin/bash
# 使用more来查看gzip文件
# 定义错误退出代码
NOARGS=65
NOTFOUND=66
NOTGZIP=67
# 判断是否传递参数
if [ $# -eq 0 ]
then
echo "Usage: `basename $0` filename " >&2
exit $NOARGS
fi
filename=$1
if [ ! -f "$filename" ]
then
echo "File $filename no found !" >&2
exit $NOTFOUND
fi
# 检查文件 “扩展名”
# 其实,这不是最交的判断是否zip格式的方法
if [ ${filename##*.} != "gz" ]
then
echo "File $1 is not a gzipped file !"
exit $NOTZIP
fi
zcat $1 | more
exit 0

Tip:文件名(testtext,txt.gz)是否是以.gz 结尾的?
方法1:
从最右边开始,取3个字符,判断是否是.gz
方法2:
参数替换
$ {filename##*.}
语法是:
${variable#pattern} 匹配最短
${variable##pattern} 匹配最长
四、组合比较与测试
1.组合比较 Compound Comparison
1.1通过布尔操作符来比较
1.1.1 -a 逻辑与
[ expl -a pxp2 ]
1.1.2 -o 逻辑或
[ exp1 -o exp2 ]
1.2通过比较操作符来组合比较
1.2.1 && 逻辑与
[ exp1 && exp2 ]
1.2.2 || 逻辑或
[ epx1 || exp2]
#!/bin/bash
a=24
b=47
# 1 而且 &&
if [ "$a" -eq 24 ] && [ "$b" -eq 47 ]
then
echo "Test #1 succeeds."
else
echo "Test #1 fails."
fi
#如果这样写,会出错
#if [ "$a" -eq 24 && “$b" -eq 47 ]
#如果这样写,没有问题
#if [[ "$a" -eq 24 && "$b" -eq 47 ]]
# 2 或者 ||
if [ "$a" -eq 88 ] || [ "$b" -eq 47 ]
then
echo "Test #2 succeeds."
else
echo "Test #2 fails."
fi
# 3 而且 -a
if [ "$a" -eq 24 -a "$b" -eq 47 ]
then
echo "Test #3 succeeds."
else
echo "Test #3 fails."
fi
# 4 或者 -o
if [ "$a" -eq 88 -o "$b" -eq 47 ]
then
echo "Test #4 succeeds."
else
echo "Test #4 fails."
fi
# 5 字符串比较,而且 &&
a=aaaa
b=bbbb
if [ "$a" = aaaa ] && [ "$b" = bbbb ]
then
echo "Test #5 succeeds."
else
echo "Test #5 fails."
fi
exit 0
2.嵌套的if条件测试 Nested if Confition Teste
if [ exp1 ]
then
if [ exp2 ]
then
dosomething # 仅当exp1 和exp2均满足时
fi
fi
本文详细介绍了Shell脚本中的条件测试结构,包括if/then, if/then/else, if/elif/else,以及不同类型的比较操作,如文件测试、整数比较和字符串比较。此外,还讲解了文件测试符的使用,如-e, -f, -d等,以及整数比较操作符,如-eq, -ne, -gt等。文章通过实例分析展示了如何在脚本中进行复杂的条件判断和比较操作。
913

被折叠的 条评论
为什么被折叠?



