以上待补充
··变量测试
#判断 Name 变量是否定义
[ -v Name ]
实例:
[root@localhost ~]# class="no.13"
[root@localhost ~]# echo $class
no.13
[root@localhost ~]# [ -v class ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# unset class
[root@localhost ~]# [ -v class ]
[root@localhost ~]# echo $?
1
#判断 Name 变量是否定义并且是名称引用
[ -R Name ]
·数值测试
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-ge 是否大于等于
-lt 是否小于
-le 是否小于等于
实例:
[root@localhost ~]# i=1;j=2
[root@localhost ~]# i=1;j=2
[root@localhost ~]# [ $i -ne $j ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $i -eq $j ]
[root@localhost ~]# echo $?
1
···字符串测试
-z String 字符串是否为空,没定义为空为真,不空为假
-n String 字符串是否不空,不空为真,空为假
[[]] 用法,建议,当使用正则表达式或通配符使用,一般情况使用 [ ]
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
实例1:
[root@localhost ~]# [ -z $a ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# a=13
[root@localhost ~]# [ -z $a ]
[root@localhost ~]# echo $?
1
[root@localhost ~]#
实例2:字符串是否相同
[root@localhost ~]# str1=apple
[root@localhost ~]# str2=huawei
[root@localhost ~]# [ $str1 = $str2 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# str1=huawei
[root@localhost ~]# [ $str1 = $str2 ]
[root@localhost ~]# echo $?
0
注意:在比较字符串时,建议变量放在“ ”中
双中括号用法:
实例1:
[root@localhost ~]# ip=10.2.1.1
[root@localhost ~]# [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]
[root@localhost ~]# echo $?
0
实例2:
[root@centos8 ~]#[[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}
([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]
[root@centos8 ~]#echo $?
1
··文件测试:
存在性测试
-e FILE: 文件存在性测试,存在为真,否则为假
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-S FILE:是否存在且为套接字文件
实例:
[root@localhost ~]# [ -e a.txt ]
[root@localhost ~]# echo $?
0
文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
注意:最终结果由用户对文件的实际权限决定,而非文件属性决定
文件属性测试
-s FILE #是否存在且非空
-t fd #fd 文件描述符是否在某终端已经打开
-N FILE #文件自从上一次被读取之后是否被修改过
-O FILE #当前有效用户是否为文件属主
-G FILE #当前有效用户是否为文件属组
··()和{}
(CMD1;CMD2;...)和 { CMD1;CMD2;...; } 都可以将多个命令组合在一起,批量执行
()-开启子shell
{}-不开启子shell
实例:
[root@localhost ~]# a1=1;(echo $a1;a1=2;echo $a1);echo $a1
1
2
1
[root@localhost ~]# a1=1;{ echo $a1;a1=2;echo $a1; } ;echo $a1
1
2
2
注意:{} 里两边加空格,最后加分号
--组合测试条件
第一种[]
#两个条件均满足
[ EXPRESSION1 -a EXPRESSION2 ] 并且,EXPRESSION1和EXPRESSION2都是真,结果才为真
#只要一个满足即可
[ EXPRESSION1 -o EXPRESSION2 ] 或者,EXPRESSION1和EXPRESSION2只要有一个真,结果就为
真
#不满足条件
[ ! EXPRESSION ] 取反
第二种[[]]
COMMAND1 && COMMAND2 #并且,短路与,代表条件性的AND THEN
如果COMMAND1 成功,将执行COMMAND2,否则,将不执行COMMAND2
COMMAND1 || COMMAND2 #或者,短路或,代表条件性的OR ELSE
如果COMMAND1 成功,将不执行COMMAND2,否则,将执行COMMAND2
实例:
[root@localhost ~]# cat /etc/passwd|grep ^user
user01:x:1000:1000:user01:/home/user01:/bin/bash
[root@localhost ~]# id user01 &> /dev/null && echo "user is exist" ||echo "user is not exist"
user is exist
[root@localhost ~]# id user02 &> /dev/null && echo "user is exist" ||echo "user is not exist"
user is not exist
实例2:
ping -c1 -W1 $IP &> /dev/null && echo "$IP is up" || { echo "$IP is
unreachable"; exit; }
取磁盘分区利用率最高
df |grep '^/dev/sd' |grep -oE '[0-9]+%' |tr -d %|sort -nr|head -1
df|grep '^/dev/sd'|tr -s ' ' %|cut -d% -f5|sort -nr|head -1
--使用read命令接收输入
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d '字符' 输入结束符
-t N TIMEOUT为N秒
read -p
实例:echo -en "\E[$[RANDOM%7+31];1m"
cat <<EOF
请选择:
1)备份数据库
2)清理日志
3)软件升级
4)软件回滚
5)删库跑路
EOF
echo -en '\E[0m'
read -p "请输入上面数字1-5: " MENU
[ $MENU -eq 1 ] && ./backup.sh
[ $MENU -eq 2 ] && echo "清理日志"
[ $MENU -eq 3 ] && echo "软件升级"
[ $MENU -eq 4 ] && echo "软件回滚"
[ $MENU -eq 5 ] && echo "删库跑路"