文章目录
- 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