shell中if条件判断的实现
作者:猎人在吃肉
1、if 的基本语法:
if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 else 符合该条件执行的语句 fi
2、字符串的判断
字符串批较时,变量一定要用 双引号
。
[ -z "str" ] 如果str的长度为零,则为真 ,即判断是否为空,空即是真;
[ -n "str" ] 如果str的长度非零,则为真 ,即判断是否为非空,非空即是真;
[ "str1" = "str2" ] 如果两个字符串相同,则为真;
[ "str1" != "str2" ] 如果字符串不相同,则为真;
[ "str1" ] 如果字符串不为空,则为真,与-n类似。
示例:
if [ -z "$path" ]; then echo "head 请指定 path 的值" 1>&2 fi if [ "$opt" != "-" ]&&[ "$opt" != "+" ]; then echo "opt只能取值-或+" 1>&2 exit 1; fi
3、数值的判断
数值的比较千万不要使用大于号、小于号,数值的比较只能使用 -eq
、-gt
等。
[ num1 -eq num2 ] num1 和 num2 两数相等为真 , =
[ num1 -ne num2 ] num1 和 num2 两数不等为真 ,!=
[ num1 -gt num2 ] num1 大于 num1 为真 , >
[ num1 -ge num2 ] num1 大于等于num2 为真, >=
[ num1 -lt num2 ] num1 小于n um2 为真 , <
[ num1 -le num2 ] num1 小于等于 num2 为真, <=
示例:
if [ ${num1} -gt ${num2} ]; then echo "[相对目录]的长度应该小于[文件路径]的长度" exit 1 fi
4、文件和目录的判断
[ -e file ] 如果 file 存在,则为真。
[ -d DIR ] 如果 file 存在,且是一个目录,则为真。
[ -f file ] 如果 file 存在,且是一个普通文件,则为真。[ -r file ] 如果 file 存在且是可读的,则为真。
[ -w file ] 如果 file存在且是可写的,则为真。
[ -x file ] 如果 file 存在且是可执行的,则为真。[ -b file ] 如果 file 存在,且是一个块特殊文件,则为真。
[ -c file ] 如果 file 存在,且是一个字特殊文件,则为真。[ -g file ] 如果 file 存在且已经设置了SGID,则为真。
[ -k file ] 如果 file 存在且已经设置了粘制位,则为真。
[ -p file ] 如果 file 存在且是一个名字管道(F如果O),则为真。[ -s file ] 如果 file 存在且大小不为0,则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端,则为真。
[ -u file ] 如果 file 存在且设置了SUID (set user ID),则为真。[ -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 -ot file2 ] 如果 file1 比 file2 要老, 或者 file2 存在且 file1 不存,在则为真。
[ file1 -ef file2 ] 如果 file1 和 file2 指向相同的设备和节点号,则为真。
5、复杂逻辑判断
操作 | 说明 |
---|---|
-a | 与 |
-o | 或 |
! | 非 |
示例1:与
的使用
如果a>b 且 a< c
if (( a > b )) && (( a < c ))
或者
if [[ $a > $b ]] && [[ $a < $c ]]
或者
if [ $a -gt $b -a $a -lt $c ]
另外,“||“和”&&” 在 shell 里可以用,如下所示:
if [ a>b && a < c ]
示例2:或
的使用
如果a>b或a < c
if (( a > b )) || (( a < c ))
或者
if [[ $a > $b ]] || [[ $a < $c ]]
或者
if [ $a -gt $b -o $a -lt $c ]
另外,“||“和”&&” 在 shell 里可以用,如下所示:
if [ a>b || a < c ]
5、举例
#!/bin/bash #echo -n "please input your score:" #read score #echo "input score is $ score " 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
6、条件变量替换:
Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换条件放在 {}
中.
(1) ${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值。
(2) ${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值,同时将word赋值给value
(3) ${value:?message}
若变量以赋值的话,正常替换。否则,将消息message送到标准错误输出。(若此替换出现在Shell程序中,那么该程序将终止运行)
(4) ${value:+word}
若变量以赋值的话,其值才用word替换,否则,不进行任何替换。
(5) ${value:offset}
, ${value:offset:length}
从变量中提取子串,这里 offset 和 length 可以是算术表达式。length 不指定时,默认为从offset 开始到结尾的长度。
path="C:\Users\admin\AppData\Roaming" echo ${path:4} 结果是 sers/admin/AppData/Roaming path="C:\Users\admin\AppData\Roaming" echo ${path:0:2} 结果是 C: path="C:\Users\admin\AppData\Roaming" echo ${path:0-7} Roaming
(6) ${#value}
变量的字符个数,长度。
(7) ${value#pattern}
, ${value##pattern}
去掉 value 中与 pattern 相匹配的部分,条件是value的开头与pattern相匹配, #
与 ##
的区别在于一个是最短匹配模式 ,一个是最长匹配模式。
(8) ${value%pattern}
, ${value%%pattern}
于(7)类似,只是是从value的尾部于pattern相匹配, %
与 %%
的区别与 #
与 ##
一样
(9) ${value/pattern/string}
, ${value//pattern/string}
进行变量内容的替换,把与pattern匹配的部分替换为string的内容, /
与 //
的区别与上同。
path="C:\Users\admin\AppData\Roaming" path=${path//'\'//} echo $path
输入结果是
C:/Users/admin/AppData/Roaming
到此这篇关于shell中if条件判断的实现的文章就介绍到这了,更多相关shell if条件判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!