热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shell流程控制3

条件判断 格式1:test 条件表达式格式2:[ 条件表达式 ] 条件表达式前后都有空格格式3:[[ 条件表达式 ]] 条件表达式前后都有空格,
条件判断

格式1:test 条件表达式

格式2:[ 条件表达式 ] 条件表达式前后都有空格

格式3:[[ 条件表达式 ]] 条件表达式前后都有空格,支持正则表达式

文件测试

格式:[ 操作符 文件 ]

文件测试常用参数

[root@localhost ~]# [[ -d /home ]] && echo $?
0
[root@localhost ~]# [ -d /home ] && echo $?
0
[root@localhost ~]# test -d /home &&echo $?
0
[root@localhost ~]# [ ! -d /ccc ] && mkdir /ccc

数值比较(整数)

示例:

[root@localhoat ~]# id -u
0
[root@localhost ~]# [ $(id -u) -eq 0 ] && echo "当前是超级用户"
当前是超级用户
[alice@localhost ~]$ [ $UID -eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
you不是超级用户C语言风格的数值比较(了解)
[root&#64;localhost ~]# ((1<2));echo $?
0
[root&#64;localhost ~]# ((1&#61;&#61;2));echo $?
1
[root&#64;localhost ~]# ((1>2));echo $?
1
[root&#64;localhost ~]# ((1>&#61;2));echo $?
1
[root&#64;localhost ~]# ((1<&#61;2));echo $?
0
[root&#64;localhost ~]# ((1!&#61;2));echo $?
0
[root&#64;localhost ~]# ((&#96;id -u&#96;>0));echo $?
1
[root&#64;localhost ~]# (($UID&#61;&#61;0));echo $?
0

 

字符串比较

字符串比较时要加双引号

[root&#64;localhost ~]# [ "$USER" &#61; "root" ];echo $?
0
[root&#64;localhost ~]# [ "$USER" &#61;&#61; "root" ];echo $?
0
注意&#xff1a;
""&#xff1a;弱引用&#xff0c;可以实现变量和命令的替换
[root&#64;localhost ~]# x&#61;*
[root&#64;localhost ~]# echo "$x"
*
&#39;&#39;&#xff1a;强引用&#xff0c;不完成变量替换
[root&#64;localhost ~]# x&#61;*
[root&#64;localhost ~]# echo &#39;$x&#39;$x

扩展&#xff1a;判断变量字符串是否为空
-z&#xff1a;变量字符串为空&#xff0c;返回值0

-n&#xff1a;变量字符串不为空&#xff0c;返回值0

[root&#64;localhost ~]# var1&#61;111
[root&#64;localhost ~]# var2&#61;
[root&#64;localhost ~]# //var3变量没有定义
[root&#64;localhost ~]# echo ${#var1} #显示变量中字符串的个数
3
[root&#64;localhost ~]# echo ${#var2}
0
[root&#64;localhost ~]# echo ${#var3}
0
[root&#64;localhost ~]# [ -z "$var1" ];echo $? //-z 变量字符串为空
1
[root&#64;localhost ~]# [ -z "$var2" ];echo $?
0
[root&#64;localhost ~]# [ -z "$var3" ];echo $?
0
[root&#64;localhost ~]# [ -n "$var1" ];echo $? //-n 变量字符串不为空
0
[root&#64;localhost ~]# [ -n "$var2" ];echo $?
1
[root&#64;localhost ~]# [ -n "$var3" ];echo $?
1

条件结构

流控制


在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。

流控制命令&#xff1a;能让脚本的流根据条件而改变的命令称为条件流控制命令

exit语句&#xff1a;退出程序的执行&#xff0c;并返回一个返回码&#xff0c;返回码为0正常退出&#xff0c;非0为非正常退出


if语句


if结构

单分支结构

条件判断语法&#xff1a;
if [判断条件]---代码返回0表示真&#xff0c;非0为假if 条件测试
then 命令序列
fiif [ condition ];thencommandcommand
fiif test 条件;then命令
fiif [[ 条件 ]];then命令
fi

双分支结构

if 条件测试
then 命令序列
else 命令序列
fiif [ 1 -eq 2 ];thenecho 不可能
elseecho 不等于
fi

 多分支结构

if 条件测试1
then 命令序列[elif 条件测试2
then 命令序列elif 条件测试3
then 命令序列]...else 命令序列
fi

层层嵌套结构

if [ condition1 ];thencommand1 if [ condition2 ];thencommand2fielseif [ condition3 ];thencommand3elif [ condition4 ];thencommand4elsecommand5fi
fi如果条件1满足&#xff0c;执行命令1&#xff1b;如果条件2也满足执行命令2&#xff0c;如果不满足就只执行命令1结束&#xff1b;
如果条件1不满足&#xff0c;不看条件2&#xff1b;直接看条件3&#xff0c;如果条件3满足执行命令3&#xff1b;如果不满足则看条件4&#xff0c;如果条件4满足执行命令4&#xff1b;否则执行命令

循环结构

for循环

语法结构&#xff1a;for i in {范围}

for i in {取值范围} #for是关键字 i是变量名 in是关键字
do #循环体的开始循环体
done #循环体的结束for语句需要定义一个变量和取值范围&#xff0c;根据不同的变量值值执行相同的命令&#xff0c;直到变量值用完。

两种格式

c语言风格
for ((i&#61;1; i<&#61;100; i&#43;&#43;)) 初值;条件;自增
doecho $i
donei&#43;&#43;&#61;&#61;&#61;先赋值再运算
&#43;&#43;i&#61;&#61;&#61;先运算再赋值&#xff08;1&#xff09;i&#43;&#43;实例&#xff1a;
for (( i&#61;1;i <&#61; 5;i&#43;&#43; ))
dolet x&#61;i&#43;&#43; i&#xff1a;2 4 6echo $i x: 1 3 5echo $x
done&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#xff08;2&#xff09;&#43;&#43;i实例&#xff1a;
for (( i&#61;1;i <&#61; 5;&#43;&#43;i ))
dolet x&#61;&#43;&#43;i i&#xff1a;2 4 6echo $i x: 2 4 6 echo $x
donepython风格
for i in {1..100}
doecho $i
done另一种写法&#xff1a;seq的使用
for i in $(seq 1 100) seq 1 100&#61;1-100
doecho $i
done

案例
批量添加账户&#xff1a;
#!/usr/bin/env bash
#批量添加账户
for i in {30..40}douseradd user$i && echo "123" | passwd --stdin user$i &>/dev/nullif [ $? -eq 0 ];thenecho "账户 user$i 添加成功"elseecho "账户 user$i 添加失败"fidone批量删除账户&#xff1a;
#!/usr/bin/env bash
#批量删除账户
for i in {30..40}douserdel -r user$i &>/dev/null[ $? -eq 0 ] && echo "账户 user$i 删除成功" || echo "账户 user$i 删除失败"done

while循环

不断重复的执行循环体中的语句&#xff0c;直到某个条件成立

while语句结构
while 条件测试
do循环体
done
当条件测试成立&#xff08;条件测试为真&#xff09;&#xff0c;执行循环体until语法结构
until 条件测试
do循环体
done
当条件测试成立&#xff08;条件测试为假&#xff09;&#xff0c;执行循环体

案例
#!/bin/bash
i&#61;1
until [ "$i" -eq 21 ]
douserdel -r user$ilet i&#43;&#43;
done案例
echo "please enter a number between 5 and 10 :"
read var
while [[ $var !&#61; 0 ]]
doif [ "$var" -lt 5 ] thenecho "Too smail , Try again"read varelif [ "$var" -gt 10 ]then echo "Too big , Try again"read varelseecho "Congratulation! You are right."exit 0;fi
done

case匹配模式

case 语法结构
case $变量 inpattern1)list1;; ---------------------结尾。pattern2)list2;;... ...patternN)listN;;*) --------------------> 如果前面命令没有执行成功那么执行下面这个list*;;
esac命令;;表明流应该跳转到case语句的最后&#xff0c;类似C语言中的break指令。
第一行: 声明case关键字调用case语法, 紧跟的“变量”一般为用户的输入值, in代表从下方的各个模式进行匹配
第2-4行: 匹配到“pattern1”后进行命令的输出或执行, pattern1: 一般为字符或数值
第11-12行: 当用户输入的字符不存在匹配模式时, 直接执行或打印*)下的命令或语句

示例

#!/usr/bin/env bash
cat <<-EOF
&#43;-------------------------------------------------------------------------&#43;
| System_tools V1.0 |
&#43;-------------------------------------------------------------------------&#43;
| a. Stop And Disabled Firewalld. |
| b. Disabled SELinux Secure System. |
| c. Install Apache Service. |
| d. Quit |
&#43;-------------------------------------------------------------------------&#43;
EOF
echo "Please input your select: " && read var
case "$var" in"a")systemctl stop firewalld && systemctl disable firewalld;; "b")setenforce 0;; "c")yum -y install httpd httpd-tools;; "d")exit;; *)printf "请按照上方提供的选项输入!!!\n";;
esac可以搭配while循环增强脚本可用性

循环控制语句

break&#xff1a;在语句块执行过程中终止循环&#xff0c;并且跳出整个循环

contiue&#xff1a;在语句块执行过程中终止当前循环&#xff0c;跳出该次循环&#xff0c;执行下一次循环。

exit&#xff1a;在语句块执行过程中退出脚本

格式化打印

printf 使用引用文本或空格分隔的参数&#xff0c;外面可以在 printf 中使用格式化字符串&#xff0c;还可以制定字符串的宽度、左右对齐方式等。使用 printf 的脚本比使用 echo 移植性好。

语法格式&#xff1a;printf format-string [arguments...]
• format-string: 为格式控制字符串
• arguments: 为参数列表。$ echo "Hello, Shell"
Hello, Shell$printf "Hello, Shell" $ printf "Hello, Shell\n"
Hello, Shell vim printf.sh
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 张三 男 66.1234
printf "%-10s %-8s %-4.2f\n" 李四 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876%s %f都是格式替代符
%-10s 指一个宽度为10个字符&#xff08;-表示左对齐&#xff0c;没有则表示右对齐&#xff09;&#xff0c;任何字符都会被显示在10个字符宽的字符内&#xff0c;如果不足则自动以空格填充&#xff0c;超过也会将内容全部显示出来。
%-4.2f 指格式化为小数&#xff0c;其中.2指保留2位小数。- 左/右对齐
字符串&#xff1a;%s
小数&#xff1a;%f
数字&#xff1a;%d

颜色

shell脚本中echo显示内容带颜色显示&#xff0c;需要使用到-e参数
格式1&#xff1a;echo -e “\033[背景颜色;字体颜色m 要输出的字符 \033[0m”
格式2&#xff1a;echo -e “\e[背景颜色;字体颜色m 要输出的字符 \e[0m”echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”控制选项&#xff1a;
\033[0m&#xff1a;关闭所有属性
\033[1m&#xff1a;高亮显示&#xff0c;加粗
\033[5m&#xff1a;闪烁


推荐阅读
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 如何修改MySQL数据库密码的方法及步骤详解
    本文详细介绍了四种修改MySQL数据库密码的方法,包括使用SET PASSWORD命令、mysqladmin命令、UPDATE语句直接编辑user表的步骤和操作示例。通过本文的指导,读者可以轻松掌握修改MySQL数据库密码的技巧和方法。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
卢嘉怡i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有