shell编程之判断详解,超多实例,干货满满,详细解剖,确定不来看看?

本文深入讲解Shell编程中的条件测试,包括文件测试操作符、数值比较、字符串比较以及逻辑运算。详细阐述了if语句的单分支、双分支、多分支和嵌套结构,并通过案例介绍了case模式匹配的使用。最后总结了各种符号的意义和脚本执行方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、条件测试

1.格式

格式1:test 条件表达式
格式2:[ 条件表达式 ]:注意两边的空格
格式3:[[ 条件表达式 ]

2.文件测试操作符

先看一个例子:

[root@cheng ~]# test -d /etc ;echo $?   //测试/etc是否为目录,并输入返回值
0
[root@cheng ~]# [ ! -d /etc ] ;echo $?   //换一种格式测试,!是取反
1

-d 意思就是测试是否为目录
操作符有以下:

-f : 当文件存在时返回真
-b : 当文件存在并且是块文件时返回真(返回0)
-d : 当目录存在并且是一个目录时返回真
-h : 当文件存在并且是符号链接文件时返回真 (或 -L 文件)
-u : 当由目录指定的文件或目录存在并且设置了SUID 位时返回真
-c : 当文件存在并且是字符文件时返回真
-e : 当由目录指定的文件或目录存在时返回真
-g : 当由目录指定的文件或目录存在并且设置了SGID 位时返回真
-k : 当由目录指定的文件或目录存在并且设置了"粘滞"位时返回真
-p : 当文件存在并且是命名管道时返回真
-r : 当由目录指定的文件或目录存在并且可读时返回真
-s : 当文件存在并且文件大小大于0 时返回真
-S : 当文件存在并且是socket 时返回真
-t fd : 当fd是与终端设备相关联的文件描述符时返回真
-w : 当由目录指定的文件或目录存在并且可写时返回真
-x : 当由目录指定的文件或目录存在并且可执行时返回真
-O : 当由目录存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
-G : 当由目录存在并且属于当前进程的有效用户id 的用户的用户组时返回真
file1 -nt file2 : file1 比file2 新时返回真
file1 -ot file2 : file1 比file2 旧时返回真

3.数值比较操作符

[ -gt ]    (>)    大于
[ -lt ]   (<)    小于
[ -eq ]   (=)   等于
[ -ne ]   (!=)   不等于
[ -ge ]   (>=)   大于等于
[ -le ]   (<=)   小于等于

[root@cheng ~]# [ 1 -gt 2 ];echo $?     //判断1大于2,结果输出非0
1

4.字符串比较

=  ==   等于
!=     不等于
-z     判断长度是否0(空格和未定义是0),不是则输出非0
-n     判断长度不为0,是0则输出0

5.逻辑里的and和or

&& 逻辑中"and",“和"的意思,也可以用”-a"表达,&&使用时需用[[]]
||   逻辑里"or",“或"的意思,也可以用”-o"表达,||使用时需用[[]]

[root@cheng ~]# num=58;[ $num -gt 60 -a $num -lt 100 ];echo $?  
1
[root@cheng ~]# [ 1 -lt 2 -o 5 -gt 10 ];echo $?
0
[root@cheng ~]# [[ 1 -lt 2 || 5 -gt 10 ]];echo $?
0

二、if—流程控制

1.单分支结构

1)语法

单分支结构
if 条件测试
then 命令序列
fi

2)示例

用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456。

#!/bin/bash
read -p "请输入创建用户的用户名: " name
id $name &> /dev/null
if [ $? -ne 0 ]; then               //如果在一行需加;来分开
	useradd $name
	echo "123456" | passwd --stdin $name &> /dev/null    //设置用户密码
	echo "$name 用户创建成功,密码是123456"
fi

2.双分支结构

1)语法

if 条件测试
then
命令序列
else
命令序列
fi

2)示例

输入用户名,无则创建,并设置密码123456,存在则提示已存在。

#!/bin/bash
read -p "请输入创建用户的用户名: " name
#id $name  &> /dev/null
#if  [  $?  -ne  0  ]     ;then
if ! id $name &> /dev/null             //相当于上方两行的注释合意
then
	useradd $name
	echo "123456" | passwd --stdin $name &> /dev/null
	echo "$name 用户创建成功,密码是 123456"
else
	echo "$name 用户已存在"
fi

3.多分支结构

1)语法

多分支结构
if 条件测试1
then 命令序列
elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列
…(可实现无数个分支)
else 命令序列
fi

2)示例

通过读取判断系统时间来进行问候。

#!/bin/bash
hour=`date +%H`
if [ $hour -ge 6 -a $hour -le 10 ];then
		echo "早上好!"
elif [ $hour -ge 11 -a $hour -le 13 ];then
	echo "中午好!"
elif [ $hour -ge 14 -a $hour -le 18 ];then
	echo "下午好!"
else
	echo "晚上好!"
fi

4.嵌套结构

1)语法

if 条件测试1 ;then 命令序列
if 条件测试1 ;then 命令序列
else 命令序列
fi
else 命令序列
fi(在一个分支里再进行该分支下的分支流程控制)

2)示例

用户输入用户名,若存在,输出已存在,若无,创建用户,并输入自定义密码,长度超过7位创建用户,少于7设置失败。

read -p "请输入创建用户的用户名: " name
id $name &> /dev/null
if [  $? -eq 0   ];then
echo "$name 存在"
else
        useradd $name
        echo "$name create finished"
        read -p "请输入用户密码: "  pass
                if [ ${#pass}  -ge  7  ];then
                echo "$pass" | passwd --stdin $name
                echo "$name 用户密码是 $pass"
                else
                echo "密码不合格" 
                fi
fi

三、case—模式匹配

1.语法结果

case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)       //其他选择
命令序列4
esac

2.实例1—实现跳板机

1)实现目标(通过一个服务器直接远程连接其他的服务器)

跳板主机
1)web1
2)web2
3)myqsl1
h) help
q) exit

2)脚本代码
#!/usr/bin/bash
web1=192.168.122.152          //定义目标主机IP
web2=192.168.122.128
mysql1=192.168.122.88
while :             //while循环跳转菜单不退出,下一个循环博客会详细解析
do
cat <<EOF           //打印跳转菜单
1.WEB1
2.WEB2
3.MYSQL1
4.
EOF        
read -p "请输入您的选择: " num       //读取用户输入
case $num in          //判断用户选择
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
3)
ssh root@$myqsl1
;;
h)
man
;;
q)
Exit
;; 
*)
echo '选择错误'
esac
done

3.实例2—系统管理工具箱

1)实现目标

h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序

2)脚本代码
#!/usr/bin/bash
cat <<-EOF
h. help
f. disk partation
d. filesystem mount
m. memory
u. system load
q.exit
EOF
read -p "please input [h for help]: " action
case "$action" in
f)
	fdisk -l
	;;
d)
	df -hT
	;;
m)
	free -m
	;;
u)
	uptime
	;;
q)
	exit
	;;
*)
	echo "选择无效"
	;;
esac

四、总结

1.符号总结

() 子shell中执行: (cd /home;ls)
(()) 比较数值,运算 C语言: ((1<2));echo $?
$() 命令替换,或者反撇``: touch file $(date)
$(()) 整数运算: echo $((1+1))

{}集合: touch file{1…3}
${}字符串的提取和替换。: echo ${aaa-111}

[] 条件测试: [ -f file1.txt ]; echo $?

[[]] 条件测试,支持正则 : [[ 12 =~ [0-9]+$ ]] ;echo $?
$[] 整数运算: echo $[1+1]

2.脚本部分概念汇总

./01.sh    <需要执行权限> 在子shell中执行
bash 01.sh  不需要执行权限 在子shell中执行
. 01.sh    不需要执行权限 在当前shell中执行
source 01.sh  不需要执行权限 在当前shell中执行

调试脚本的其他方法:
#sh -n 02.sh  仅调试脚本中的语法错误。
#sh -vx 02.sh  以调试的方式执行,查询整个执行过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值