当前位置: 首页 > news >正文

Linux-Shell脚本流程控制

1.流程控制

流程控制是改变程序运行顺序的指令。

1.1.条件判断

1.1.1.文件类型判断

参数说明
-d判断指定的目录是否存在
-e判断文件是否存在,存在即为真
-f判断普通文件是否存在
-L判断文件是否存在且为连接文件

普通文件(Regular Files)

普通文件是最常见的文件类型,它们可以包含任何类型的数据。例如,文本文件、程序代码、二进制数据等都是普通文件。普通文件可以通过文本编辑器(如vi, nano等)或二进制编辑器查看和编辑。

特殊文件

特殊文件包括以下几种类型:

  1. 目录(Directories):目录是包含其他文件和目录的文件。它们在文件系统中用于组织文件。目录本身也是一种特殊类型的文件,但不是普通文件。

  2. 字符设备文件(Character Device Files):这些文件代表字符设备,如键盘、调制解调器等。它们通常用于输入/输出操作。

  3. 块设备文件(Block Device Files):这些文件代表块设备,如硬盘驱动器、DVD驱动器等。它们用于存储数据的设备。

  4. 管道(Pipes):管道是一种特殊的文件,用于在进程之间传递数据。管道可以是单向的或双向的。

  5. 套接字(Sockets):套接字用于网络通信,允许不同计算机上的进程间通信。

如何区分普通文件和非普通文件

在Unix和Linux系统中,你可以使用ls -l命令来查看文件的详细信息,其中第一列的第一个字符用来指示文件的类型:

  • - 表示普通文件。

  • d 表示目录。

  • l 表示符号链接(symbolic link)。

  • c 表示字符设备文件。

  • b 表示块设备文件。

  • p 表示管道文件。

  • s 表示套接字。

示例一:

# 判断文件是否存在,存在为0,不存在为1
root@zking:~# test -e a.txt 
root@zking:~# echo $?
0
root@zking:~# test -d a.txt 
root@zking:~# echo $?
1
root@zking:~# test -f b.txt
root@zking:~# echo $?
1

# 除了test以外,还可以使用中括号,但是需要注意括号里条件前后必须要用空格
root@zking:~# [-e b.txt]
[-e: command not found
root@zking:~# [ -e b.txt] 
bash: [: missing `]'
root@zking:~# [ -e b.txt ]
root@zking:~# echo $?
1

root@zking:~# [ -d /home ] && echo "is directory" || echo "is not directory"
is directory
root@zking:~# [ -f b.txt ] && echo "file" || echo "no file"
no file
root@zking:~# [ -f a.txt ] && echo "file" || echo "no file"
file

1.1.2.文件权限判断

参数说明
-r判断文件是否存在且有读权限
-w判断文件是否存在且有写权限
-x判断文件是否存在且有执行权限,注意:拥有者,所属组,其他人只用有一个有指定权限就算有
-u会返回真,上面的参数也一样 判断文件是否存在且有SUID权限
-g判断文件是否存在且有SGID权限
-k判断文件是否存在且有SBIT权限

  • SUID:如果命令自身有SUID,不管被谁执行,进程的属主则是文件自身的属主。SUID是Set UID设置用户ID,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。用户在修改密码的时候最张会修改/etc/shadow 文件,而如果去看这个文件的权限你会发现普通用户对它既不能查看更不能修改,这里正是passwd的SUID权限让普通用户也可以操作shadow文件。注意:SUID只对二进制文件有效

  • SGID:类同SUID,在此类目录下创建的文件不再是自己的属组,而是目录的组。SGID即Set GID,它对普通二进制文件和目录都有效。当它作用于普通文件时,和SUID类似。当作用于目录时,当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

  • Sticky [SBIT]即Sticky Bit,它出现在其他用户权限的执行位上,它只能用来修饰一个目录。当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以删除,它出现在文件所属组权限的执行位上面,在一个公共目录,每个都可以创建、删除自己的文件,但不能删除别人的文件。一般用于目录的权限控制。

示例一:

# 判断a.txt文件是否具备读的权限
root@zking:~# [ -r a.txt ] && echo "yes" || echo "no"
yes


# 判断a.txt文件是否具备写的权限
root@zking:~# [ -x a.txt ] && echo "yes" || echo "no"
no
# 判断paramdemo.sh是否具备执行的权限
root@zking:~# [ -x paramdemo.sh ] && echo "yes" || echo "no"
yes

1.1.3.两个文件的判断

参数说明
file1 -nt file2file1的最后修改时间是否比file2新,是在返回真
file1 -ot file2file1的最后修改时间是否比file2旧,是在返回真
file1 -ef file2file1inode号是否与file2的一致,即是否为同一个文件

stat 查看文件的信息,包括inode号,如果inode号相同,则为同一个文件

inode号在硬链接文件相同

示例一:

root@zking:~# touch b.txt
root@zking:~# ls
a.txt  paramdemo02.sh  person.txt   snap
b.txt  paramdemo.sh    readdemo.sh  workspace
# 判断a.txt的最后修改时间是否比b.txt新
root@zking:~# [ a.txt -nt b.txt  ] && echo "yes" || echo "no"
no

1.1.4.整数比较

参数说明
num1 -eq num2==
num1 -ne num2!=
num1 -gt num2>
num1 -lt num2<
num1 -ge num2>=
num1 -le num2<=

示例一:

root@zking:~# [ 1 > 2 ] && echo "yes" || echo "no"
yes
root@zking:~# [ 1 -gt 2 ] && echo "yes" || echo "no"
no

1.1.5.字符串判断

参数说明
-z str是否为空,为空返回真
-n str判断是否为非空,非空返回真
str1 == str2判断是否相等
str1 != str2判断是否不等

示例一:

root@zking:~# name="zs"
root@zking:~# [ -z $name ] && echo "yes" || echo "no"
no
root@zking:~# [ -z $age ] && echo "yes" || echo "no"
yes

root@zking:~# [ "abc" == "abc" ] && echo "yes" || echo "no"
yes
root@zking:~# [ "abc" == "bdc" ] && echo "yes" || echo "no"
no

1.1.6.多重判断

参数说明
判断1 -a 判断2and
判断1 -o 判断2or
!判断

示例一:

root@zking:~# num=100
root@zking:~# [ -n $num -a $num -gt 200 ] && echo "yes" || echo "no"
no
root@zking:~# num=201
root@zking:~# [ -n $num -a $num -gt 200 ] && echo "yes" || echo "no"
yes

1.2.if语句

if语句格式如下:

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

示例一:

#!/bin/bash
#author test
num=$1
if [ $num -gt 100 ];then
echo ">100"
fi

示例二:监控磁盘占用率

#!/bin/bash
#author: zking
#description: 当sda1盘的占用达到90%即输出警告信息

# 针对变量初始化
declare -i rate=0
# 获取/dev/sda1的磁盘占用率
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 90 ];then
echo "warning! /dev/sda1 is full"
fi

示例三:多if分支

#!/bin/bash
#author: zking
read -p "please input a num:" num
if [ $num -gt 10 -a $num -le 100 ];then
echo "100>=num>10"
exit 1
elif [ $num -gt 100 -a $num -le 1000 ]; then
echo "1000>=num>100"
exit 2
elif [ $num -gt 1000 -a $num -le 10000 ]; then
echo "10000>=num>1000"
exit 3
else
echo "other num"
fi

1.3.case语句

if elif else语句一样都是属于分支语句,不同点在于,case只能判断一种条件关系,if可以判断多种条件关系。case语句语法格式如下:

case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
*)
不符合以上模式执行的命令
esac

示例一:

#!/bin/bash
#author: zking
#discription: case
read -p "please input [y/n]:" -t 30 choose

case $choose in
"y")
echo "your input y..."
;;
"n")
echo "your input n..."
;;
*)
echo "your input is others..."
;;
esac

1.4.for语句

for语句命令格式如下:

for 变量名 in 取值列表; do
命令
done

示例一:

#!/bin/bash
#author: zking
for i in 1 2 3 4 5 6 
do
echo $i
done

#!/bin/bash
#author: zking
for ((i=0;i<=10;i++))
do
echo $((i))
done


#!/bin/bash
#author: zking
for i in {1..9}
do
echo $i
done

#!/bin/bash
#author: zking
list="hello shell world"
for str in $list
do
echo $str
done

示例:批量添加用户

#初始密码均设为123456
[root@localhost]# vim user.txt
jack
rose
dav
[root@localhost]# vim useradd.sh
#!/bin/bash
users=$(cat user.txt)
for user in $users
do
useradd $user
echo "123456" | passwd --stdin $user
echo "$user添加成功"
done

示例:批量删除用户

#!/bin/bash
users=$(cat user.txt)
for user in $users
do
userdel -r $user #'-r 删除家目录'
echo "$user删除成功"
done

示例: 根据IP地址检查主机状态

检测IP地址192.168.19.20-192.168.19.40段落

[root@localhost opt]# vim ipchk.sh 
#!/bin/bash
for ((i=20;i<=40;i++))
do
ping -c 3 -i 0.2 -W 3 "192.168.19.$i" &> /dev/null
if [ $? -eq 0 ]
then
echo "Host 192.168.19.$i is up"
else
echo "Host 192.168.19.$i is down"
fi
done

ping

-c N发送 N 个 ICMP 数据包自动化测试、脚本调用
-i N设置发送间隔为 N 秒(默认 1s)控制流量节奏
-w N总等待时间不超过 N 秒超时控制

1.5 while语句

语法:

while [ 条件测试操作 ]
do
命令序列
done

示例:

#!/bin/bash
#author: zking
i=1
while [ $i -le 5 ] 
do
echo $i
let i+=1
done

http://www.lryc.cn/news/611969.html

相关文章:

  • [linux] Linux系统中断机制详解及用户空间中断使用方法
  • Linux网络-------6.数据链路层
  • 昇思+昇腾开发板+DeepSeek模型推理和性能优化
  • 【注意】HCIE-Datacom华为数通考试,第四季度将变题!
  • 开发避坑指南(18): SpringBoot环境变量配置错误:占位符解析失败解决方案
  • Android UI 组件系列(十二):RecyclerView 嵌套及点击事件
  • git 清理submodule
  • 每日算法刷题Day57:8.6:leetcode 单调栈6道题,用时2h
  • K8S、Docker安全漏洞靶场
  • 实战 Seata:实现分布式事务解决方案
  • ORACLE进阶操作
  • 在NVIDIA Orin上用TensorRT对YOLO12进行多路加速并行推理时内存泄漏
  • 完整的登陆学生管理系统(配置数据库)
  • 电商支付异常测试全攻略
  • 013 HTTP篇
  • 秋招笔记-8.6
  • eclipse2023创建工作集
  • 使用python与streamlit构建的空间微生物分析
  • harbor仓库搭建(配置https)
  • 虚幻GAS底层原理解剖五 (AS)
  • 常见的大模型分类
  • #3:Maven进阶与私服搭建
  • 面试问题11
  • 用html写一个类似于postman可以发送请求
  • PyCharm vs. VSCode 到底哪个更好用
  • 面试题:基础的sql命令
  • 使用Nginx部署前后端分离项目
  • AS32S601 芯片 ADC 模块交流耦合测试:技术要点与实践
  • 大前端游戏应用中 AI 角色行为智能控制
  • AdGuard 安卓修改版:全方位广告拦截与隐私保护专家