shell(第二章判断)

shell条件测试

语法格式

test 条件表达式 -d(判断目录) -e(判断文件和目录) -f(文件)

[ 条件表达式 ]

[[ 条件表达式 ]]

数值比较[ 整数 操作符 整数 ]

[ ] 准备做测试符

操作符 也是数值比较的操作符

-gt 大于

-lt 小于

-eq 等于

-ne 不等于

-ge 大于等于

-le 小于等于

例如:[ 12 -gt 32 ] ; echo $?

1 #说明上一条命令是错的12不大于32

文件测试[ 测试符 文件或目录 ]

测试符 参数

[ -f 1.txt ] ;echo $? 指定检测是文件并存在返真

[ -b 1.txt ] ;echo $? 指定检测是块文件并存在时返真

[ -d 1.txt ] ;echo $? 指定检测是目录并存在时返真

[ -h 1.txt ] ;echo $? 指定检测是符号链接文件并存在时返真

[ -c 1.txt ] ;echo $? 指定检测是字符文件时并存在返真

[ -e 1.txt ] ; echo $? 指定检测是文件或目录时并存在返真

[ -g 1.txt ] ;echo $? 指定检测是文件或目录并设置了SGID位时返真 (g+s权限)

[ -k 1.txt ] ;echo $? 指定检测是文件或目录并设置了“粘滞位”时返真 (o+t权限)

[ -p 1.txt ] ;echo $? 指定检测是命名管道并存在时返真

[ -r 1.txt ] ;echo $? 指定检测文件或目录存在可读时返真 (针对的是当前用户,不能是root)

[ -w 1.txt ] ;echo $? 指定检测文件或目录存在可写时返真(针对的是当前用户,不能是root)

[ -x 1.txt ] ;echo $?指定检测文件或目录存在可执行时返真(针对的是当前用户,不能是root)

[ -s 1.txt ] ; echo $? 指定检测文件大于0并存在时返真

[ -S 1.txt ] ; echo $? 指定检测文件是套接字文件(socket)并存在时返真

[ -O 1.txt ];echo $? 指定检查当前用户是否为指定文件的所有者

[ -G 1.txt ];echo $? 指定检查当前用户是否属于拥有指定文件的组

字符串测试 [ 字符串 = 字符串 ]

字符串 提示使用弱引号

= 等于

例如

read -p "您确定要升级这件装备吗?" select if [ "$select" = "yes" ] then echo "装备升级开始。。。" else echo "感谢您,欢迎下次光临。" fi

!= 不等于

例如

read -p "您确定要升级这件装备吗?" select if [ "$select" != no" ] then echo "装备升级开始。。。" else echo "感谢您,欢迎下次光临。" fi

echo ${#ll} #号表示统计变量的字符个数

参数

[ -z "$ll" ] ;echo $? 制定监测变量的字符数为0时返真

[ -n "$ll" ] ;echo $? 制定监测变量的字符数不为0时返真

and or

and =&&= -a 条件全部成立才可以

or =||= -o 条件瞒足一个就可以

测试时如果里面有特殊符号时用[[ ]]双中括号

比如:

[[ 1 -lt 2 && 40 -gt 10 ]] ;echo $? #1小于2 并且40大于10时返真

[ ${#li} -ge 7 ] && [[ ${li=~ a-z } ]] &&[[ ${li=~ A-Z } ]] #脚本用法

if

结果一共为两个值时可以用 if [ $? -ne 0 ];then 来测试

then #当条件成立以后做下面的命令

单分支

if开头 fi 结尾

例如:

#!/bin/bash read -p "请输入您要创建的用户名:" name #收集变量 id $name &> /dev/null #测试变量 if [ $? -ne 0 ]; then #上一条命令结果不为真那么执行下面的操作 useradd $name #创建用户 echo "$name 创建成功" #提示

双分支

if条件测试成功 做then下面的命令 if条件测试失败做else下面的命令

例如:

#!/bin/bash read -p "请输入您要创建的用户名:" name #收集变量 id $name &> /dev/null #测试变量 if [ $? -ne 0 ]; then #上一条命令结果不为真那么执行下面的操作 useradd $name #创建用户 echo "$name 创建成功" #提示 else #上一天条命令结果为真执行下面的操作 echo "用户已经存在" # 提示 fi #结尾

if 后面跟 id $name ; then 前面没有[ ]检测符命令的话 then 捕捉的只能是正确的 else只能是错误的

例如:

read -p "请输入您要创建的用户名:" name

if id $name &>/dev/null ;then

echo "用户已经存在"

else

useradd $name

echo "123" | passwd --stdin $name &> /dev/null

echo "$name 用户创建成功 , 密码为123"

fi

多分支

elif

elif应用 例如:

hour=`date +%H`

if [ $hour -ge 6 -a $hour -lt 10 ];then

echo "早上好"

elif [ $hour -ge 10 -a $hour -lt 13 ];then

echo "中午好"

elif [ $hour -ge 13 -a $hour -lt 18 ];then

echo "下午好"

else

echo "晚上好"

fi

if的嵌套结构

嵌套结构运用

#!/bin/bash 

read -p "请输入新的用户:" name

id $name &>/dev/null

if [ $? -eq 0 ];then

echo "$name 用户已经存在"

read -p "是否删除$name用户[yes/no]:" seslct

if [ $seslct = yes ];then

userdel -r $name

echo "$name 用户已经删除"

else

echo "用户未删除"

fi

else read -p "请输入新用户的密码:" pass

if [ ${#pass} -ge 7 ];then

useradd $name

echo "$pass" | passwd --stdin $name &> /dev/null

echo "$name 用户创建成功,密码是$pass"

else

echo "用户密码不足7位数,创建用户失败"

fi

fi

调试脚本

sh -x 1.sh 这将该脚本并显示所有变量的值

sh -n 1.sh 仅调试脚本中的语法错误。

例如:脚本出错

sh -vx 1.sh 以调试的方式执行,查询整个执行过程

例如:脚本出错提醒

模式匹配 case

简单的模式匹配

用户无论如何回答都可以叫脚本捕捉

标准模式

下面写一个case和if嵌套的案例

#!/bin/bash

read -p "请输入需要创建的用户名:" name

id $name &> /dev/null

if [ $? -eq 0 ];then

echo "$name 用户已经存在"

read -p "是否删除$name 用户[y/n]" pp

case $pp in

yes|YES|Yes|YEs|yES|yEs|yeS|YeS|y|Y)

userdel -r $name &> /dev/null

echo "$name 用户已删除"

;;

*)

echo "$name 用户取消删除"

;;

esac

else

read -p "请确认是否创建用户为$name [y/n]" pppp

case $pppp in

yes|YES|Yes|YEs|yES|yEs|yeS|YeS|y|Y)

read -p "请输入7位数密码:" pass

if [ ${#pass} -ge 7 ];then

useradd $name &> /dev/null

echo "$name 用户创建成功,密码为$pass"

else

echo "$name 用户创建失败" fi

;;

*)

echo "很遗憾$name 用户创建失败"

;;

esac

fi

简单的jumpserver

跳板主机 跳板脚本 一台服务器管理多台服务器 运行脚本直接转跳

变量名=变量值

cat<<EOF
1.变量名
2.变量名...  ...
read -p "请选择要管理的服务器:"  变量
case 变量  in

ssh 用户名 @$变量名
;;
*)
;;
esac
案例:
#!/bin/bash
wbe="192.168.72.150"                                                                          
cat <<EOF                                                                                        
1.wbe                                                                                                        
EOF                                                                                                  
read -p "请用户选择要转跳的服务器:" pp
case $pp in
1)
ssh root@$wbe
;;
*)
echo "没有该服务器,拜拜"
exit
;;
esac

系统管理工具箱

h 显示命令帮助

f 显示磁盘分区

d 显示磁盘挂载

m 查看内存使用

u 查看系统负载

q 退出程序

案例:

#!/bin/bash
#注意后面的是命令,尽量不要写进脚本不然不美观
cat << EOF
f 显示磁盘分区                    fdisk  -l   lsblk gdisk  -l
d 显示磁盘挂载                    df  -Th
m 查看内存使用                    free -m
u 查看系统负载                    uptime
q 退出程序                            exit
EOF
read -p "请选择:" kkk
case  $kkk in
f)
lsblk
;;
d)
df -Th
;;
...   ...
*)
;;
esac

在这里给大家一个说一下、下一个文档的写的是循环
给大家一个循环的脚本(一个整蛊的小脚本)

#!/bin/bash 
read -p "请输入您的姓名:" name
while :
do
read -p "请问你是傻子吗?" shi
if [ $shi = 是 ] ;then
    echo "大傻子 $name 再见"
    exit 666
else
    echo "输入错误,请重新输入"
fi
done
 

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值