15Shell脚本—流程控制
流程控制语句
尽管可以通过使用Linux命令、管道符、重定向以及条件测试语句编写最基本的Shell脚本,但是这种脚本并不适用于生产环境。原因是它不能根据真实的工作需求来调整具体的执行命令,也不能根据某些条件实现自动循环执行。
例如,我们需要批量创建 1000 为用户,首先要判断这些用户是否已经存在;若不存在,则通过循环语句让脚本一次创建他们。
常用的有if、for、while、case这4种流程控制语句。
- if 条件测试语句
1.1 单分支结构
if 条件测试操作
then 命令序列
fi
#shell脚本文件内容
[root@rockman 0619]# cat mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
#执行脚本
[root@rockman 0619]# bash mkcdrom.sh
#查看执行结果
[root@rockman 0619]# ls -l /media
total 0
drwxr-xr-x. 2 root root 6 Jun 19 11:10 cdrom
1.2 多分支结构
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
在Linux系统中,read是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量,-p参数用于向用户显示一定的提示信息。
[root@rockman 0619]# cat chkscore.sh
#!/bin/bash
read -p "Enter your score(0-100): " GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
[root@rockman 0619]# bash chkscore.sh
Enter your score(0-100): 98
98 is Excellent
for条件循环语句
for 变量名 in 取值列表
do
命令序列
done
下面使用for循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账号并设置密码。
首先创建用户名称列表,每个用户名单独一行。
[root@rockman 0619]# vim users.txt
[root@rockman 0619]# cat users.txt
bob
lily
然后编写Shell脚本,其中,/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕保持简洁。
[root@localhost 0619]# cat Example.sh
#!/bin/bash
#批量添加用户
#输入用户密码(待创建的所有用户)
read -p "Enter The Users Password: " PASSWD
#对users.txt中的每一个用户名:检查用户名是否存在,如果存在,打印提示信息;如果不存在,则添加用户。添加成功或失败,都打印出错信息
for UNAME in `cat users.txt`
do
# &> 表示将标准输出与错误输出共同写入到文件中
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME, Create success"
else
echo "$UNAME, Create failure"
fi
fi
done
执行批量创建用户的Shell脚本。/etc/passwd是用来保存用户账号信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息。
[root@localhost 0619]# bash Example.sh
Enter The Users Password: 1
bob, Create success
lily, Create success
[root@localhost 0619]# tail -5 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
hk:x:1000:1000:hk:/home/hk:/bin/bash
bob:x:1001:1001::/home/bob:/bin/bash
lily:x:1002:1002::/home/lily:/bin/bash
while条件循环语句
while 条件测试操作
do
命令序列
done
编写Shell脚本。
[root@localhost 0619]# cat Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
read -p "请输入您猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ]; then
echo "恭喜你答对了,实际价格是 $PRICE"
echo "您共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ]; then
echo "太高了!"
else
echo "太低了!"
fi
done
运行shell脚本
[root@localhost 0619]# bash Guess.sh
商品实际价格为0-999之间,猜猜看是多少?
请输入您猜测的价格数目:555
太高了!
请输入您猜测的价格数目:333
太高了!
请输入您猜测的价格数目:222
太低了!
请输入您猜测的价格数目:300
太高了!
请输入您猜测的价格数目:255
太高了!
请输入您猜测的价格数目:244
太低了!
请输入您猜测的价格数目:250
太高了!
请输入您猜测的价格数目:247
太高了!
请输入您猜测的价格数目:246
恭喜你答对了,实际价格是 246
您共猜测了 9 次
- case条件测试语句(略)
15Shell脚本—流程控制的更多相关文章
- 《Shell脚本学习指南》学习笔记之变量、判断和流程控制
变量 定义变量 可以使用export和readonly来设置变量,export用于修改或打印环境变量,readonly则使得变量不得修改.语法: export name[=word] ... read ...
- shell脚本之流程控制
shell脚本之流程控制 shell脚本之流程控制 条件语句 条件判断 循环语句for,while,until for循环 while循环 until循环 循环控制语句continue 循环控制语 ...
- 工控随笔_19_西门子_WinCC的VBS脚本_08_常量和流程控制_01
在编程的过程中,有时候我们会使用一些固定的值,例如圆周率,或者某个人的生日,或者家庭住址等等, 这些信息对于一个对象来说一旦确定就不会改变,因此我们在编程的时候也不希望这些信息会改变,在VBS里面 也 ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Shell基础(六):使用awk提取文本、awk处理条件、awk综合脚本应用、awk流程控制、awk扩展应用
一.使用awk提取文本 目标: 本案例要求使用awk工具完成下列过滤任务: 1> 练习awk工具的基本用法 2> 提取本机的IP地址.根分区使用率 3> 格式化输出/et ...
- Shell脚本 (三) 条件判断 与 流程控制
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 六.条件判断 1.基本语法 [ condition ](注意condition 前后要有空格) 注意:条 ...
- shell脚本 3 流程控制
shell流程控制 流程控制是改变程序运行顺序的指令.linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介 ...
- Shell脚本学习 - 流程控制和函数
继续Shell的学习.上两篇是关于基本数据类型,基本语法以及运算符相关,这一篇是流程控制相关(if, for, while) 流程控制 if else 流程控制不可为空,如果else没有语句执行,就不 ...
随机推荐
- Codeforces 1175E(倍增)
要点 与cf 1168C相似的一点都是看某点x最远能拓展到哪里 看数据想要在logn内查询,考虑倍增步数 const int maxn = 2e5 + 5, X = 5e5 + 5, LOG = 25 ...
- loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划
loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...
- 手动配置 FreeBSD 网络
设置 IP 地址和网关 编辑 /etc/rc.conf $ sudo vim /etc/rc.conf # 设置ip地址和子网掩码 ifconfig_em0="inet 192.168.0. ...
- 转Keil 中使用 STM32F4xx 硬件浮点单元
Keil 中使用 STM32F4xx 硬件浮点单元一.前言有工程师反应说 Keil 下无法使用 STM32F4xx 硬件浮点单元, 导致当运算浮点时运算时间过长,还有 一些人反应不知如何使用芯片芯片内 ...
- 给Eclipse设置android的SDK位置时,出现这个:This Android SDK requires Andr...ate ADT to the latest
这样的问题很好解决,一个升级ADT到指定版本或以上,另一个简单的办法是调低SDK版本 找到android-sdk-windows\tools\lib下的plugin.prop文件修改其中的版本号,改为 ...
- T-SQL查询处理执行顺序(一)
对于T-SQL编程,用得最广泛的,莫过于查询(Querying).要想写出高质量.高性能的查询语句,必须深入地了解逻辑查询处理. 一.逻辑查询处理的各个阶段 (5)SELECT DISTINCT TO ...
- enable assembly bind failure logging (Fusion) in .NET
今天遇到新建wcf项目编译成64位版本在64位windows上无法运气的,问题 先百度了一下如何查看程序集加载日志: Add the following values to HKEY_LOCAL_MA ...
- Country roads take me home, to the place I belong.
Country roads take me home, to the place I belong.故乡的路,带我回家吧,回到我期盼已久的归宿.
- mui选择时间、选择日期
完整代码: <header class="mui-bar mui-bar-nav"> <a class="mui-action-back mui-i ...
- 数据结构-List接口-LinkedList类-Set接口-HashSet类-Collection总结
一.数据结构:4种--<需补充> 1.堆栈结构: 特点:LIFO(后进先出);栈的入口/出口都在顶端位置;压栈就是存元素/弹栈就是取元素; 代表类:Stack; 其 ...