字符串表达式
字符串表达式介绍
注意:大写的注意,在shell脚本中所有变量的调用,请一定加上双引号,尤其是和字符串相关的,千言万语汇成一句话"加双引号"
字符串表达式
-n 判断字符串是否为空
有值为真 没有报错
非空就成立
[root@web02 ~]# test -n "$abc"
[root@web02 ~]# echo $?
1
[root@web02 ~]# abc=123
[root@web02 ~]# test -n "$abc"
[root@web02 ~]# echo $?
0
-z 无值为真
[root@web02 ~]# test -z "$abcd" && echo '字符串为空' || echo '字符串不为空'
字符串为空
[root@web02 ~]# abcd=123
[root@web02 ~]# test -z "$abcd" && echo '字符串为空' || echo '字符串不为空'
字符串不为空
"str1" = "str2"
[root@web02 test]# test 'abc' = 'abc' && echo '字符相等' || echo '字符不等'
字符相等
[root@web02 test]# test 'abc' = 'abz' && echo '字符相等' || echo '字符不等'
字符不等
"str1" != "str2"
[root@web02 test]# test 'abc' != 'abz' && echo '字符不等' || echo '字符相等'
字符不等
[root@web02 test]# test 'abc' != 'abc' && echo '字符不等' || echo '字符相等'
字符相等
表达式 | 含义 |
---|---|
-n | 非空则成立(有值就为真) |
-z | 空则成立(无值就为真) |
"str1" = "str2" | 等号左边字符串与右边字符串相等则成立 |
"str1" != "str2" | 等号左边字符串与右边字符串不等则成立 |
整数表达式
表达式 | 含义 | test举例 | [[]]举例 |
---|---|---|---|
-eq | equal 等于 | test 2 -eq 2 | [[ 2 -eq 2 ]] |
-ne | not equal 不等于 | test 2 -ne 2 | [[ 2 != 2 ]] |
-gt | great than 大于 | test 2 -gt 2 | [[ 2 > 2 ]] |
-ge | great equal 大于等于 | test 2 -ge 2 | [[ 2 >= 2 ]] |
-lt | less than 小于 | test 2 -lt 2 | [[ 2 < 2 ]] |
-le | less equal 小于等于 | test 2 -le 2 | [[ 2 <= 2 ]] |
[root@web02 test]# [ 2 > 1 ] && echo '成功' || echo '失败'
成功
[root@web02 test]# [[ 2 >= 1 ]] && echo '成功' || echo '失败'
bash: syntax error in conditional expression
bash: syntax error near `1'
# 单括号有时候会把>识别为重定向
[root@web02 test]# [ $age > 20 ] && echo '成功' || echo '失败'
失败
[root@web02 test]# age=20
[root@web02 test]# [ $age \> 10 ] && echo '成功' || echo '失败'
成功
[root@web02 test]# ll
total 8
-rw-r--r-- 1 root root 0 Jun 28 11:22 1
-rw-r--r-- 1 root root 0 Jun 28 11:25 20
-rw-r--r-- 1 root root 670 Jun 28 11:00 jsq.sh
-rw-r--r-- 1 root root 487 Jun 28 10:22 mxjsq.sh
[root@web02 test]# [ $age \> 10 ] && echo '成功' || echo '失败'
成功
[root@web02 test]# [ $age \> 3 ] && echo '成功' || echo '失败'
失败
[root@web02 test]# [ $age \> 10 ] && echo '成功' || echo '失败'
成功
[root@web02 test]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@web02 test]# seq 10 | sort
1
10
2
3
4
5
6
7
8
9
[root@web02 test]# [ $age -gt 10 ] && echo '成功' || echo '失败'
失败
[[]]的成员运算
=~:成员运算
# 前面的值包不包含后面的输入
[root@web02 ~]# name=dd
[root@web02 ~]# [[ $name =~ 'd' ]] && echo '包含' || echo '不包含'
包含
[root@web02 ~]# [[ $name =~ '1' ]] && echo '包含' || echo '不包含'
不包含
[root@web02 test]# [[ $name =~ 'do' ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ [0-9] ]] && echo '包含' || echo '不包含'
不包含
[root@web02 test]# [[ $name =~ [a-z] ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ ^[a-z] ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ [a-z]$ ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ ^[a-z]$ ]] && echo '包含' || echo '不包含'
不包含
[root@web02 test]# [[ $name =~ ^[a-z]+$ ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ 'g'$ ]] && echo '包含' || echo '不包含'
包含
[root@web02 test]# [[ $name =~ 'd'$ ]] && echo '包含' || echo '不包含'
不包含
逻辑运算表达式
&&
||
!
[ $num -eq 0 -a $num2 -eq 3 ]
[ $num -eq 0 -a $num2 -eq 3 ]
and条件
只有都为真,条件才为真,条件中有任何一个为假,那么结果就是假。
逻辑符号 | 条件1 | 条件2 | 结果 |
---|---|---|---|
-a | 真 | 真 | 真 |
真 | 假 | 假 | |
假 | 真 | 假 | |
假 | 假 | 假 |
or条件
只要有一个为真,结果就是真,除非两个都为假,结果才是假。
逻辑符号 | 条件1 | 条件2 | 结果 |
---|---|---|---|
-o | 真 | 真 | 真 |
真 | 假 | 真 | |
假 | 真 | 真 | |
假 | 假 | 假 |
企业面试题
命令行中输入一个数字,如果数字是1,则输出1,如果是2则输出2,既不是1也不是2则显示脚本使用方法,并退出程序
#!/bin/bash
is_num(){
re='^[0-9]+$'
if ! [[ $1 =~ $re ]];then
return 1
fi
return 0
}
read -p '请输入一个数字:' u
if ! is_num "$u"; then
echo "输入无效,请输入整数:1或2"
exit 1
fi
if
[ $u -eq 1 ];then
echo '1'
elif
[ $u -eq 2 ];then
echo '2'
else
echo '请输入正确的内容:1或2'
fi
#!/bin/bash
num=$1
if [ $num -eq 1 -o $num -eq 2 ];then
echo $num
else
echo "Usage: $0 {1|2}"
fi
使用read进行传参,实现两个整数比较大小,并将结果打印到屏幕。
#!/bin/bash
is_num(){
re='^[0-9]+$'
if ! [[ $1 =~ $re ]];then
return 1
fi
return 0
}
read -p '请输入第一个数字:' u
if ! is_num "$u"; then
echo "输入无效,请输入数字"
exit 1
fi
read -p '请输入第二个数字:' g
if ! is_num "$g"; then
echo "输入无效,请输入数字"
exit 1
fi
if [ $u -gt $g ];then
echo "$u 大于 $g"
elif [ $u -eq $g ];then
echo "$u 等于 $g"
else
echo "$u 小于 $g"
fi