目录
[test测试文件的表达式 是否成立](#test测试文件的表达式 是否成立)
[且 (全真才为真)](#且 (全真才为真))
[或 (一真即为真)](#或 (一真即为真))
[[[ expression ]] 用法](#[[ expression ]] 用法)
[( ){ } 可以将多个命令组合在一起,批量执行](#( ){ } 可以将多个命令组合在一起,批量执行)
测试
test测试文件的表达式 是否成立
格式
1.test 条件表达式
- [ 条件表达式 ] (注意[ ]空格,否则会失败)
3.[ 操作符 文件或目录 ]
选项
-d:测试是否为目录(Directory)
bash
[root@localhost ~]# test -d /etc/
[root@localhost ~]# echo $?
0
-e:测试目录或文件是否存在(Exist)
bash
[root@localhost ~]# test -e /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -e /fwf
[root@localhost ~]# echo $?
1
-a:测试目录或文件是否存在(Exist)
bash
[root@localhost ~]# test -a /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -a /fwf
[root@localhost ~]# echo $?
1
a和e的区别在于a不可以取非
bash
[root@localhost ~]#[ ! -e /etc/shadow ]
[root@localhost ~]#echo $?
1
[root@localhost ~]#[ ! -a /etc/shadow ]
[root@localhost ~]#echo $?
0
-f:测试是否为文件(File)
bash
[root@localhost ~]# test -f /etc/init.d
[root@localhost ~]# echo $?
1
[root@localhost ~]# test -f /etc/yum.conf
[root@localhost ~]# echo $?
0
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
root执行权限别人没有root也没有,别人有root也有
bash
[root@localhost 123]# ll /etc/shadow
----------. 1 root root 1266 11月 8 13:21 /etc/shadow
[root@localhost 123]# [ -r /etc/shadow ]
[root@localhost 123]# echo $?
0
#实际效果,不是表面显示,注意root权限
[root@localhost 123]# [ -x /etc/shadow ]
[root@localhost 123]# echo $?
1
#root执行权限别人没有root也没有,别人有root也有
[root@localhost 123]#
-L: 测试是否为软连接文件
bash
[root@localhost /]# test -L /etc/localtime
[root@localhost /]# echo $?
0
[root@localhost /]# test -L /etc/yum.conf
[root@localhost /]# echo $?
1
[root@localhost /]#
测试是否成功使用 $? 返回值(0为正确,非0不正确)
比较整数数值
格式
[ 整数1 -操作符 整数2 ] 公式
选项
-eq:第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个数大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
bash
[root@localhost /]# a=6
[root@localhost /]# b=9
[root@localhost /]# [ $a -eq $b ]
[root@localhost /]# echo $?
1
[root@localhost /]# [ $a -le $b ]
[root@localhost /]# echo $?
0
[root@localhost /]#
字符串比较
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符是否存在
格式
[ 字符串1 = 字符串2 ] 是否相同
bash
[root@localhost /]# qwe=xuyucheng
[root@localhost /]# rty=taishuail
[root@localhost /]# [ $qwe = $rty ]
[root@localhost /]# echo $?
1
[root@localhost /]# rty=xuyucheng
[root@localhost /]# [ $qwe = $rty ]
[root@localhost /]# echo $?
0
[root@localhost /]#
[ 字符串1 != 字符串2 ] 是否不相同
bash
[root@localhost /]# qwe=xuyucheng
[root@localhost /]# rty=taishuail
[root@localhost /]# [ $qwe != $rty ]
[root@localhost /]# echo $?
0
[ -z 字符串 ] 是否为空
bash
[root@localhost /]# rty=taishuail
[root@localhost /]# [ -z $rty ]
[root@localhost /]# echo $?
1
[root@localhost /]# rty=" "
[root@localhost /]# [ -z $rty ]
[root@localhost /]# echo $?
0
[root@localhost /]#
[ -n 字符串 ] 字符是否存在
逻辑测试
格式
-
[ 表达式1 ] 操作符 [ 表达式2 ] ...
-
命令1 操作符 命令2 ...
且 (全真才为真)
第一个要真 第二 个也要真 才能是真
如果第一个为假 ,整个 就为假 不用执行下个操作
cmd1 && cmd2
或 (一真即为真)
如果第一个 为真 那么 不用执行第二个
第一个为假 ,才需要执行第二个
cmd1 || cmd2
常见条件
-a或&&:逻辑与,"而且"的意思全真才为真
-o或||:逻辑或,"或者"的意思一真即为真
!:逻辑否
双中括号
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN(元字符)为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
bash
[root@localhost ~]# xuc=tre.log
[root@localhost ~]# [[ "$xuc" == *.log ]] //是否有.log结尾的
[root@localhost ~]# echo $?
0
[root@localhost ~]# xuc=tre.text //将字符串重新定义
[root@localhost ~]# [[ "$xuc" == *.log ]] //是否有.log结尾的
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ "$xuc" != *.log ]] //!取反 是否没有.log结尾的
[root@localhost ~]# echo $?
0
[root@localhost ~]#
( ){ } 可以将多个命令组合在一起,批量执行
bash
[root@localhost ~]# (cd /opt;ls)
999 nginx-1.18.0 qqq.sh test2
aa nginx-1.18.0.tar.gz rh
a.tar.gz nginx-1.18.0.tar.gz.0 test
etc qqq test1
( )会开启子shell
{ } 不会开启子进程
if语句的结构
if语句 单分支 判断条件 成功执行
不成功 不执行
分支结构
单分支
if 判断条件;
then 条件为真的分支代码
fi
双分支
if 判断条件;then
条件为假的分支代码
fi
多分支
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3;then
条件3为真的分支代码
...
else
以上条件都为假的分支代码 托底
fi
举例
单分支
判断是否为超级管理员
bash
#!/bin/bash
if [ "$USER" != "root" ]
then
echo "非用户管理员"
else
echo "是管理员用户"
fi
判断主机连通性
bash
#!/bin/bash
ping -c 3 192.168.17.2
if
[ $? = 0 ]
then
echo "与真机网络通畅"
exit 1
fi
echo "与真机不通"
多分支
考试成绩
bash
#!/bin/bash
read -p "请输入你的成绩:" cj
if [ $cj -ge 85 ]&&[ $cj -le 100 ]
then
echo "你的成绩为$cj"
echo "你的成绩为优秀"
elif [ $cj -ge 70 ]&&[ $cj -le 84 ]
then
echo "你的成绩为$cj"
echo "你的成绩为良好"
elif [ $cj -ge 60 ]&&[ $cj -le 69 ]
then
echo "你的成绩为$cj"
echo "你的成绩为合格"
else
echo "你的成绩为$cj"
echo "你的成绩不合格"
fi
case
格式
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
read -p
case $num in
条件判断1)
命令序列)
;;
条件判断2)
命令序列2)
;;
esac
字符
* 任意长度任意字符
? 任意单个字符
[0-9] 指定范围内的任意单个字符
| 或者,如: a|b
例子
考试成绩
bash
[root@localhost qqq]# bash 4.sh
请输入你的分数4
4 不及格
[root@localhost qqq]# cat 4.sh
#!/bin/bash
read -p "请输入你的分数" cj
case $cj in
100)
echo "$cj 你好棒!"
;;
[89][0-9])
echo "$cj 一般般吧,仍需努力"
;;
[67][0-9])
echo "$cj 及格"
;;
[0-9]|[1-5][0-9])
echo "$cj 不及格"
;;
*)
echo "输入有误"
esac
石头剪刀布
bash
#!/bin/bash
m=`echo $[RANDOM%3+1]`
read -p "请输入 1.石头2.剪刀3.布:" h
if [ $m -eq $h ]
then
echo "打成平局"
bash $0
elif [ $h -eq 1 -a $m -eq 2 -o $h -eq 2 -a $m -eq 3 -o $h -eq 3 -a $m -eq 1 ]
then
echo "人类胜利"
else
echo 机器胜利
fi
#!/bin/bash
key=`echo $[RANDOM%3+1]`
read -p "请输入1包子 2剪子 3 锤子:" num
case $num in
1)
num="包子"
;;
2)
num="剪子"
;;
3)
num="锤子"
;;
*)
echo "你输错了!"
exit
;;
esac
case $key in
1)
key="包子"
;;
2)
key="剪子"
;;
3)
key="锤子"
;;
esac
if [ $num = "包子" -a $key = "锤子" -o $num = "剪子" -a $key = "包子" -o $num = "锤子" -a $key = "剪子" ]
then
echo 机器出的是$key
echo 你出的是$num
echo "人类胜利"
elif [ $num = $key ]
then
echo 机器出的是$key
echo 你出的是$num
echo "打成平局再来一次"
else
echo 机器出的是$key
echo 你出的是$num
echo "机器胜利"
fi
echo
echo -n 表示不换行输出
echo -e 表示输出转义符
常用的转义符
不换行显示
\c 使用在数字中间会把后面内容删除
date
date查看当前系统时间
-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间
%F 完整日期格式,等价于 %Y-%m-%d
% T 时间(24小时制)(hh:mm:ss
cal 2023
seq
从1 开始 步长为2 到10 为止
从 20开始 步长为 -1 到1 为止