添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
深沉的蘑菇  ·  NTNU-Resources&Offices·  2 月前    · 
玩足球的手术刀  ·  慈恩传_百度百科·  5 月前    · 
IF条件判断

1、基本语法:
if [ command ]; then
符合该条件执行的语句
fi

2、扩展语法:
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi


3、语法说明:
bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语句,否则后面的命令不执行,跳到下一条命令。
当有多个嵌套时,只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0,则执行else中语句。
返回状态:最后一个命令的退出状态,或者当没有条件是真的话为0。


注意:
1、[  ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
4、判断是不支持浮点值的
5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
6、在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
7、使用-z或者-n来检查长度的时候,没有定义的变量也为0
8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
9、? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)


常用参数:
文件/目录判断:
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。
[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。
[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)
[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。
[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)
[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。


字符串判断
[ -z STRING ]    如果STRING的长度为零则返回为真,即空是真
[ -n STRING ]    如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ]    如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ]   如果两个字符串相同则返回为真
[ STRING1 != STRING2 ]    如果字符串不相同则返回为真
[ STRING1 < STRING2 ]     如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ]     如果 “STRING1”字典排序在“STRING2”后面则返回为真。


数值判断
[ INT1 -eq INT2 ]          INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ]          INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ]           INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ]          INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ]            INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ]           INT1小于等于INT2返回为真,<=


逻辑判断
[ ! EXPR ]       逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ]      逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ]      逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[  ] || [  ]           用OR来合并两个条件
[  ] && [  ]        用AND来合并两个条件


其他判断
[ -t FD ]  如果文件描述符 FD (默认值为1)打开且指向一个终端则返回为真
[ -o optionname ]  如果shell选项optionname开启则返回为真


IF高级特性:
双圆括号((  )):表示数学表达式
在判断命令中只允许在比较中进行简单的算术操作,而双圆括号提供更多的数学符号,而且在双圆括号里面的'>','<'号不需要转意。

双方括号[[  ]]:表示高级字符串处理函数
双方括号中判断命令使用标准的字符串比较,还可以使用匹配模式,从而定义与字符串相匹配的正则表达式。

双括号的作用:
在shell中,[ $a != 1 || $b = 2 ]是不允许出,要用[ $a != 1 ] || [ $b = 2 ],而双括号就可以解决这个问题的,[[ $a != 1 || $b = 2 ]]。又比如这个[ "$a" -lt "$b" ],也可以改成双括号的形式(("$a" < "$b"))


实例
1:判断目录$doiido是否存在,若不存在,则新建一个
if [ ! -d "$doiido"]; then
mkdir "$doiido"
fi


2:判断普通文件$doiido是否存,若不存在,则新建一个
if [ ! -f "$doiido" ]; then
touch "$doiido"
fi


3:判断$doiido是否存在并且是否具有可执行权限
if [ ! -x "$doiido"]; then
mkdir "$doiido"
chmod +x "$doiido"
fi


4:是判断变量$doiido是否有值
if [ ! -n "$doiido" ]; then
echo "$doiido is empty"
exit 0
fi


5:两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi


6:测试退出状态:
if [ $? -eq 0 ];then
echo 'That is ok'
fi


7:数值的比较:
if [ "$num" -gt "150" ]
echo "$num is biger than 150"
fi


8:a>b且a<c
(( a > b )) && (( a < c ))
[[ $a > $b ]] && [[ $a < $c ]]
[ $a -gt $b -a $a -lt $c ]


9:a>b或a<c
(( a > b )) || (( a < c ))
[[ $a > $b ]] || [[ $a < $c ]]
[ $a -gt $b -o $a -lt $c ]


10:检测执行脚本的用户
if [ "$(whoami)" != 'root' ]; then
echo "You have no permission to run $0 as non-root user."
exit 1;
fi

上面的语句也可以使用以下的精简语句
[ "$(whoami)" != 'root' ] && ( echo "You have no permission to run $0 as non-root user."; exit 1 )

11:正则表达式
doiido="hero"
if [[ "$doiido" == h* ]];then
echo "hello,hero"
fi



============ 其他例子============
1、查看当前操作系统类型
#!/bin/sh
SYSTEM=`uname -s`
if [ $SYSTEM = "Linux" ] ; then
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi


2、if利用read传参判断
#!/bin/bash
read -p "please input a score:" score
echo -e "your score [$score] is judging by sys now"

if [ "$score" -ge "0" ]&&[ "$score" -lt "60" ];then
echo "sorry,you are lost!"
elif [ "$score" -ge "60" ]&&[ "$score" -lt "85" ];then
echo "just soso!"
elif [ "$score" -le "100" ]&&[ "$score" -ge "85" ];then
echo "good job!"
else
echo "input score is wrong , the range is [0-100]!"
fi


3、判断文件是否存在
#!/bin/sh
today=`date -d yesterday +%y%m%d`
file="apache_$today.tar.gz"
cd /home/chenshuo/shell
if [ -f "$file" ];then
echo "OK"
else
echo "error $file" >error.log
mail -s "fail backup from test" loveyasxn924@126.com <error.log
fi


4、这个脚本在每个星期天由cron来执行。如果星期的数是偶数,他就提醒你把垃圾箱清理:
#!/bin/bash
WEEKOFFSET=$[ $(date +"%V") % 2 ]

if [ $WEEKOFFSET -eq "0" ]; then
echo "Sunday evening, put out the garbage cans." | mail -s "Garbage cans out" your@your_domain.org
fi


5、挂载硬盘脚本(windows下的ntfs格式硬盘)
#! /bin/sh
dir_d=/media/disk_d
dir_e=/media/disk_e
dir_f=/media/disk_f

a=`ls $dir_d | wc -l`
b=`ls $dir_e | wc -l`
c=`ls $dir_f | wc -l`

echo "checking disk_d..."
if [ $a -eq 0 ]; then
echo "disk_d is not exsit,now creating..."
sudo mount -t ntfs /dev/disk/by-label/software /media/disk_d
else
echo "disk_d exits"
fi

echo "checking disk_e..."
if [ $b -eq 0 ]; then
echo "disk_e is not exsit,now creating..."
sudo mount -t ntfs /dev/disk/by-label/elitor /media/disk_e
else
echo "disk_e exits"
fi

echo "checking disk_f..."
if [ $c -eq 0 ]; then
echo "disk_f is not exsit,now creating..."
sudo mount -t ntfs /dev/disk/by-label/work /media/disk_f
else
echo "disk_f exits"
fi

bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语句,否则后面的命令不执行,跳到下一条命令。当有多个嵌套时,只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0,则执行else中语句。返回状态:最后一个命令的退出状态,或者当没有条件是真的话为0。
一、 条件 测试操作 要使 Shell 脚本 程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。 Shell 环境根据命令执行后的返回状态值(¥?)来 判断 是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。使用专门的测试工具——test命令,可以对特定 条件 进行测试,并根据返回值来 判断 条件 是否成立(返回值为0表示 条件 成立)。 使用test测试命令时,包括以下两种形式: test 条件 表达式 [ 条件 表达式 ] 这两种方式的作用完全相同,但通常后一种形式更为常用,需要注意的是,方括号“[“ 或 ”]”与 条件 表达式之间需要至少一个空格进行分隔。 1、文件测试:   -f当file存在并且是正规文件时返回真   -g当由pathname指定的文件或目录存在并且设置了SGID位时返回为真   -h当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效   -k当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真   -p当file存在并且是命令管道时返回为真
如果CPU占用率持续达到80以上则调用打印java线程占用率堆栈的 脚本 ,见https://github.com/oldratlee/useful- shell s/blob/master/show-busy-java-threads.sh,具体用法见他的github wiki! #!/bin/bash #cpu idle percent cpu_idle=`top -b -d 1 -n 2 | grep Cpu | awk 'NR>1{print $5}' | cut -f 1 -d .` if [ -d /opt/ script s/log ] cd /opt/ script s
Shell 编程中经常需要 判断 文件状态、字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作。本文主要讲述文件状态、字符串、数值大小的 判断 比较方法。 文件状态 判断 文件状态的 判断 通常使用test命令完成,test命令有2种基本格式:test condition / [ condition ]。后者使用时,需注意在 条件 两边加上空格,此种格式最为常用。 判断 文件状态的...
做unix/ linux 下的开发, 脚本 编写的功力是少不了的,作为 shell 编程,也是博大精深的一个技术领域,这里为了学习,就写一个简单的 判断 IP地址是否合法的微型 脚本 程序,这个小程序也是非常有用的。 IP地址是32位的,可以由4个十进制数值表示,每个数值的范围都是0~255. 代码如下: #!/bin/bash # Test an IP address for validity: # Usage: #      valid_ip IP_ADDRESS #      if [[ $? -eq 0 ]]; then echo good; else echo bad; fi #   OR pwd显示当前工作目录 以上这篇 Linux shell 脚本 获取当前工作目录的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:使用 Python 获取 Linux 系统信息的代码 Linux 系统信息查看常用命令 linux shell 中if的各种 判断 Linux shell 脚本 的建立与执行 linux she
条件 表达式 条件 表达式文件状态操作符字符串操作符数字操作符逻辑操作符命令分隔符 条件 表达式 基本命令和变量赋值语句属于顺序语句, 条件 和分支属于选择语句,for,while和until语句属于循环语句 条件 表达式是用于 判断 条件 是否满足的逻辑表达式,当 条件 为真,返回0,否则返回1 常用语法: 1、test 测试表达式 2、[ 测试表达式 ] #两边需要有空格 3、[[ 测试表达式 ]] 4、(( 测试表达式 )) 第一种和第二种是等价的,第三种是扩展的test命令,语法4常用于计算 在[[]] 双中括号中