文章目录

  • 1、if 的基本语法:
  • 2、字符串的判断
  • 3、数值的判断
  • 4、文件和目录的判断
  • 5、复杂逻辑判断
  • 示例1:`与` 的使用
  • 示例2:`或` 的使用
  • 5、举例
  • 6、条件变量替换:


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