Shell脚本流程控制(Linux篇)

2024-09-07 18:20
文章标签 linux 流程 shell 控制 脚本

本文主要是介绍Shell脚本流程控制(Linux篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.流程控制

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

1.1.条件判断

1.1.1.文件类型判断

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

示例一:

# 判断文件是否存在,存在为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权限

示例一:

# 判断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的一致,即是否为同一个文件

示例一:

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 ];thenecho ">100"
fi

示例二:监控磁盘占用率

#!/bin/bash
#author: zking
#description: 当sda1盘的占用达到90%即输出警告信息# 针对变量初始化
declare -i rate=0
# 获取/dev/sda2的磁盘占用率
rate=$(df -h | grep "/dev/sda2" | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 10 ];thenecho "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 ];thenecho "100>=num>10"exit 1
elif [ $num -gt 100 -a $num -le 1000 ]; thenecho "1000>=num>100"exit 2
elif [ $num -gt 1000 -a $num -le 10000 ]; thenecho "10000>=num>1000"exit 3
elseecho "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 choosecase $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 
doecho $i
done#!/bin/bash
#author: zking
for ((i=0;i<=10;i++))
doecho $((i))
done#!/bin/bash
#author: zking
for i in {1..9}
doecho $i
done#!/bin/bash
#author: zking
list="hello shell world"
for str in $list
doecho $str
done

这篇关于Shell脚本流程控制(Linux篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145799

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、