博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shell流程控制
阅读量:5130 次
发布时间:2019-06-13

本文共 3748 字,大约阅读时间需要 12 分钟。

1.选择结构

1.1 单分支

格式一:

if 条件判断表达式;then
条件判断成立时执行的操作
……
……
fi
格式二:
if 条件判断表达式
then
条件判断成立时执行的操作
……
……
fi

#!/bin/bashif [ $# = 0 ];then //出错的地方,数值比较用-eq等,而=用于字符比较        echo "please input sth"exit //exit为函数,无论在程序中的什么位置,只要执行到exit系统调用,进程就会停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。fihost=$1ping -c 3 $host &>/dev/null && echo "$1 is online" || echo "$1 is not online"

修改后

#!/bin/bashif [ $# -eq 0 ];then#i/bin        echo "please input sth"        exitfihost=$1ping -c 3 $host &>/dev/null && echo "$1 is online" || echo "$1 is not online"
1.2 双分支

if 条件判断表达式;then

条件判断成立时执行的操作
……
……
else
条件判断不成立时执行的操作
……
……
fi

例子:

#!/bin/bashif [ $# -eq 0 ];then        echo "please input sth"        exitelse        host=$1        ping -c 3 $host &>/dev/null && echo "$1 is online" || echo "$1 is not online"fi

嵌套的使用

#!/bin/bashif [ $# -eq 0 ];then        echo "please input sth"        exitelse        host=$1 #ping -c 3 $host &>/dev/null && echo "$1 is online" || echo "$1 is not online"//#号表示注释        ping -c 3 $host &> /dev/null        if [ $? -eq 0 ];then                echo "$1 is online"        else                echo "$1 is not online"        fifi
1.3 多分支

if条件测试1;then

命令序列
……
elif条件测试2;then
命令序列
……
elif条件测试3;then
命令序列
……
elif条件测试3;then
命令序列
……
else
命令序列
fi

执行流程:从上向下开始匹配,

例子:对输入的分数,评分档次:100-90分(优秀)、89-80(良好)、79-70(中等)、69-60(及格)、<60(不及格)。

2.循环结构(重要)

反复执行的操作。

格式一:
for 变量名 in 变量列表
do
循环体
done

如:

for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done

seq #Print numbers from FIRST to LAST, in steps of INCREMENT 打印一组数字的序列

fo

例子:

输出192.168.1.0/24网段内的前10个地址:

#!/bin/bashnetwork=192.168.1#for i in 1 2 3 4 5 6 7 8 9 10 #不灵活for i in $(seq 10)#等同于for i in `seq 10`do        echo $network.$idone

格式二:

for((初始值;条件;kk))
do
循环体
done

例子:

#!/bin/bashfor((i=1;i<=10;i++))do        echo $illlkjkkkjjdone

#!/bin/bashfor((i=1;i<=10;i++))do        useradd jerry$i        echo jerry$i | passwd --stdin jerry$i #(--stdinThis  option is used to indicate that passwd should read the new password from standard input, which can be a pipe)done

存在问题:

[root@iLor shell_day02_am]# sh addUsers02.sh
Changing password for user jerry1.
passwd: all authentication tokens updated successfully.
Changing password for user jerry2.
passwd: all authentication tokens updated successfully.
Changing password for user jerry3.
passwd: all authentication tokens updated successfully.
Changing password for user jerry4.
passwd: all authentication tokens updated successfully.
Changing password for user jerry5.
passwd: all authentication tokens updated successfully.
Changing password for user jerry6.
passwd: all authentication tokens updated successfully.
Changing password for user jerry7.
passwd: all authentication tokens updated successfully.
Changing password for user jerry8.
passwd: all authentication tokens updated successfully.
Changing password for user jerry9.
passwd: all authentication tokens updated successfully.
Changing password for user jerry10.
passwd: all authentication tokens updated successfully.
优化后:

#!/bin/bashfor((i=1;i<=10;i++))do        useradd jerry$i        echo jerry$i | passwd --stdin jerry$i &> /dev/nulldone

格式三:条件成立时执行循环体

while 条件判断表达式
do
循环体
done

例子:

#!/bin/bashi=1while [ $i -le 10 ] #不要写成i<=10,因为这不是条件表达式的写法do        echo $i        let i++ # i=`expr $i + 1`或者i=$(expr $i + 1)done

练习:输出1-20所有奇数

格式四: 条件不成立时执行循环体
until 条件判断表达式
do
循环体
done

3.分支结构

(根据变量的不同值,执行不同的操作,脚本中很常见)

格式:
case “变量名” in
模式1) #模式1可以加双引号也可以不加 : “模式1”
命令序列1……;;
模式2)
命令序列2……;;
模式3)
命令序列3……;;
……
模式n)
命令序列n……;;
*)
默认命令序列
esac

例子:

4.流程控制关键字

break

continue

exit 结束脚本的运行(默认返回0 ,又如exit 3)

return 用于函数中,不能用于脚本中

shift 位置移动函数

把脚本或函数中的位置变量按顺序向左移动一位,并删除没有值的位置变量。

true: 在条件判断中时表示永远为真

false: 在条件判断中时表示永远为假
:在条件判断中时表示永远为真,在循环体中表示什么都不做。

转载于:https://www.cnblogs.com/whatislinux/p/181a2fdbb9b052091250f962db1f3d50.html

你可能感兴趣的文章
DataGridView的行的字体颜色变化
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Android-多线程AsyncTask
查看>>
LeetCode【709. 转换成小写字母】
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
【题解】青蛙的约会
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
Red and Black(poj-1979)
查看>>
安装 Express
查看>>
存储(硬件方面的一些基本术语)
查看>>
观察者模式
查看>>
Weka中数据挖掘与机器学习系列之基本概念(三)
查看>>