shell脚本 流程控制

本文详细介绍了Shell脚本中的条件判断语句、流程控制语句、循环语句等核心概念,包括一条件判断式语句的多种格式,如文件类型判断、文件权限判断、整数和字符串比较;流程控制语句如单分支、双分支和多分支if语句,以及case条件语句;循环语句如for、while和until循环的应用实例。

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

一 条件判断式 语句

两种判断格式

test -e /root/install.log

[  -e /root/install.log ]

1.文件类型判断

 -b 文件    判断文件是否存在,并且是否为块设备文件
 -c 文件    判断文件是否存在,并且是否为字符设备文件
 
 ## 常用
 -d 文件  判断文件是否存在,并且是否为目录
 -e 文件  判断文件是否存在
 -f 文件  判断是否为文件,并且是否为普通文件

# 简单的判断文件存在 语句,不能更换位置
[ -e /root/install.log ] && echo yes || echo no
 
-L 文件  判断文件是否存在,并且判断是否为符号链接文件
-p 文件  判断文件是否存在,并且判断是否为管道文件
-s 文件  判断文件是否存在,并且判断是否为非空
-S 文件  判断文件是否存在,并且判断是否为套接字文件

2.文件权限判断

-r 文件  判断该文件是否存在,并且是否该文件拥有读权限
-w 文件  判断该文件是否存在,并且是否该文件拥有写权限
-x 文件  判断该文件是否存在,并且是否该文件拥有执行权限
-u 文件  判断该文件是否存在,并且是否该文件拥有SUID权限
-g 文件  判断该文件是否存在,并且是否该文件拥有SGID权限
-k 文件  判断该文件是否存在,并且是否该文件拥有SBit权限

3.两个文件比较

文件1 -nt 文件2   判断文件1是否比文件2 新new(修改时间)

文件1 -ot 文件2   判断文件1是否比文件2 旧old(修改时间)

文件1 -ef 文件2   判断是否是同一个文件 inode号是否一样,是否为硬链接

4.两个整数比较

x -eq y 判断相等
x -ne y 判断不相等
x -gt y 判断x是否大于y
x -lt y 判断x是否小于y
x -ge y 判断x是否大于等于y
x -le y 判断x是否小于等于y

5.字符串比较

-z 字符串   判断字符串是否为空
-n 字符串   判断字符串是否为非空
字符串1==字符串2 判断相等
字符串1!=字符串2 判断不相等

name=sun
[ -z &name ] && echo yes || echo no

6.多重判断

判断式1 -a 判断式2     逻辑与  都为真才是真

判断式1 -o 判断式2     逻辑或  有一个为真就是真

!判断    取反,逻辑非

二 流程控制语句

1.单分支if语句

# 写法1
----------------------
if [ 条件判断式 ];then
	程序
fi

# 写法2
----------------------
if [条件判断式]
	then
	程序
fi

判断登录用户是否是root

#!/bin/bash
test=$(env|grep "USER"|cut -d "=" -f2)

#输出测试,没有什么作用
echo $test 

if ["$test"=="root"]
	then
	echo "Current user is root"
fi

#解析
env 会输出环境变量
里面有一个变量
USER=root,这个是制定当前用户
使用grep 行提取命令
使用cut 列提取命令
使用等号作为分隔符,-d分隔符  -f2 取第二个字段

判断分区使用率

# 判断根分区,使用超过 90% ,就会报警

df -h | grep sda5 | awk '{print $5}' | cat -d "%" -f 1

2.双分支if语句

if [条件判断式]
	then
	条件成立,执行1
	else
	不成立,执行2
fi

判断 让用户手工输入的是否为目录

read -t 30 -p "Please input a dir: " dir

if [ -d "$dir" ]
	then
		echo "is"
	else
		echo "no no"
fi

判断apache服务是否启动

# -v grep 不包含grep

#!/bin/bash

test =$(ps aux | grep httpd | grep -v grep)
#截取httpd进程
if [ -n "$test"]
	then
		echo "$(date) httpd is ok" >> /tmp/autostart-acc.loh
	else
		/etc/rc.d/init.d/httpd start $> /dev/null
		echo "$(date) restart httpd !!" >> /tmp/autostart-err.loh
fi

# 注意脚本名字,可能会捕捉到自己的脚本名字
# 也可以口,判断是否运行

三 多分支if语句

语法结构

if 【判断1】
	then
	执行
elif [判断2]
	then
	执行
....
else
	当前面所有都不成立,执行else
fi

加减乘除运算器


数值运算
	1.判断输入是否为空
	2.判断输入内容是不是数值
	3.判断输入运算符
	4.执行运算符操作
	Bug
	
	
======================================================

#!/bin/bash
#该脚本是写一个简单的计算器

read -p "请输入第一个数字" x
read -p "请输入第二个数字" y
read -p "请输入运算符号" f

#最外层判断,判断输入的是否为空
# -n 判断 是否为非空
# -a 多重条件判断 与
if [ -n "$x" -a -n "$y" -a -n "$f" ]
        then
# 下面这个表达式用于判断输入的两个字符是否完全为数字,反引号 和 $()为同一个作用,将系统命令的值赋给变量,原理为,输出变量x的值,并利用管道符,将该值进行字符串替换, sed "s/旧字符串/新字符串/g",末尾g表示将指定范围内的所有旧字符串都替换,所以虽然[0-9]表示匹配一个字符,加了g以后,会替换所有字符。
                test1=`echo "$x" | sed "s/[0-9]//g"`
                test2=$(echo "$y" | sed "s/[0-9]//g")
#中间的判断,判断输入的两个值是否为数字
            if [ -z "$test1" -a -z "$test2" ]
                    then
# 最内层判断,判断是什么运算符号
                            if [ "$f" == "+" ]
                                    then
                                    echo "$x和$y的和是"$[$x+$y]
                            elif [ "$f" == "-" ]
                                    then
                                    echo "$x和$y的差是"$[$x-$y]
                            elif [ "$f" == "*" ]
                                    then
                                    echo "$x和$y的积是"$[$x*$y]
                            elif [ "$f" == "/" ]
                                    then
                                        echo "$x和$y的商是"$[$x/$y]
                            fi
            else
                    echo "您输入的不是数字,重新执行脚本"
                    bash jisuanqi.sh
                    exit 2
            fi
    else
            echo "您没有输入数字,重新执行脚本"
            bash jisuanqi.sh
            exit 1
fi
--------------------- 
作者:嘻游记 
来源:CSDN 
原文:https://blog.csdn.net/sinat_27932343/article/details/78858668 
版权声明:本文为博主原创文章,转载请附上博文链接!

四 多分支case条件语句

#!/bin/bash
判断用户输入
read -p "Pls..... yes/no:" -t 30 cho
case $cho in
	"yes")
		echo "you are yes "
		;;
	"no")
		echo "you are no "
		;;
	*)
		echo "you are err "
		;;
esac


# 更适合 选择的内容

五 for循环

for 变量 in 值1 值2 值3 值4.....
	do
		程序
	done
# 例子
chmod 755 xxx.sh

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

循环解压文件

#!/bin/bash

cd /root/test/
ls *.tar.gz >ls.log  #覆盖
ls *.tgz >> ls.log	 #追加

for i in $( cat ls.log)
	do
		tar -zxf $i & > /dev/null
	done

###
tar -zxvf v去掉,不看输出显示
/dev/null 是一个回收站

从1加到100

# !/bin/bash

s=0
for((i=1;i<=100;i=i+1))
	do
		s=$(($s+$i))
	done
echo $s

批量添加制定数量的用户

#!/bin/bash
# 批量添加指定数量的用户
# 创建用户默认名
# 创建默认密码。

# 输入用户名,输入信息存入name变量中,限制30s的输入时间
read -p "Please input user name:" -t 30 name
# 输入需要创建的用户数量,存入num中,限制30s输入时间
read -p "Please input the number of users:" -t 30 num
# 输入需要创建的默认密码,存入pass中,限制30s输入时间
read -p "Please input the password of users:" -t 30 pass

# 用户名、用户数量、默认密码都输入成功之后
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
        then
# 输入的num变量为数值类型
        y=$(echo $num | sed 's/[0-9]//g')
        if [ -z "$y"]
        then
# 创建用户
        for (( i=1;i<=$num;i=i+1))
                do
                # 用户名以输入用户名+序号组成 
                /usr/sbin/useradd $name$i &> /dev/null
                # 创建默认密码
                echo $pass | /usr/bin/passwd --stdin $name$i &> /dev/null
                done
        fi
fi
--------------------- 
作者:Leo-Woo 
来源:CSDN 
原文:https://blog.csdn.net/imw_mg/article/details/77892791 
版权声明:本文为博主原创文章,转载请附上博文链接!


# 删除除了root,所有的用户

六 while循环 和 until循环

while [条件判断]

	do

		程序

	done
和while相反
只有条件不成立的时候才执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值