SHELL编程笔记(二)之shell流程控制
Shell控制流程结构
- 本章内容有:
退出状态
While、for和until loops循环
If then else语句
脚本中动作
菜单 - 条件控制语句
If then else语句
if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。if语句结
构对错误检查非常有用。其格式为:
then 命令1
elif 条件2
then 命令2
else 命令3
fi
让我们来具体讲解if语句的各部分功能。
Then 那么
命令1 执行命令1
elif 条件2 如果条件1不成立
then 那么
命令2 执行命令2
else 如果条件1,2均不成立
命令3 那么执行命令3
fi 完成
if语句必须以单词fi终止。在if语句中漏写fi是最一般的错误。我自己有时也是这样。elif和else为可选项,如果语句中没有否则部分,那么就不需要elif和else部分。If语句可以有许多elif部分。最常用的if语句是if then fi结构。例题1:
#!/bin/sh
#author: li0924
if [ -lt ];then
echo "Yes, you are right"
fi
注意;then不要跟if一行;若是一行则需要添加;
例题二:通过测试设置为接受用户输入的变量可以测知用户是否输入信息。下面的例子中测试用户键入return键后变量name是否包含任何信息
#!/bin/sh
#author: li0924
echo -n "ENTRY YOUR NAME: "
read name
#"$name" = "" or -n $name
if [ -n $name ];then
echo "please input you name!"
fi
例题三:不必拘泥于变量或数值测试,也可以测知系统命令是否成功返回。对grep使用if语句找出grep是否成功返回信息
#!/bin/sh
#author: li0924
if grep -i "ready" * > /dev/null >&
then
echo "it is ready;here"
fi
例题四:环境变量用于测试条件,即LOGNAME是否包含root值。这类语句是加在脚本开头作为一安全性准则的普遍方法。当然LOGNAME可用于测试任何有效用
#!/bin/sh
#author: li0924
if [ $LOGNAME = "root" ];then
echo "the LOGNAME is root"
else
echo "NO"
fi
#!/bin/sh
#author: li0924
echo -n "please input your login name: "
read name
if [ -z $name ];then
echo "please input your login name:"
elif [ "$name" = "root" ];then
echo "hello root";
elif [ "$name" = "li0924" ];then
echo "hello li0924";
elif [ "$name" = "lottu" ];then
echo "hello lottu";
fi
case语句
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
case语句格式如下:
模式1)
命令1
. . .
;;
模式2)
命令2
. . .
;;
esac
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号*捕获该值,再接受其他输入。
例题1:提示输入1到5,输入数字传入case语句,变量ANS设置为case取值测试变量ANS,ANS将与每一模式进行比较。如果匹配成功,则执行模式里面的命令直至;;,这里只反馈非用户数字选择的信息,然后case退出,因为匹配已找到
#!/bin/sh
#author: li0924
echo -n "please input 1-5: "
read ANS
case $ANS in
)
echo "you select 1"
;;
)
echo "you select 2"
;;
)
echo "you select 3"
;;
)
echo "you select 4"
;;
)
echo "you select 5"
;;
*)
echo "$0 :this is not between 1 and 5"
;;
esac
例题二:使用case时,也可以指定“|”符号作为或命令,例如vt100|vt102匹配模式vt100或vt102。下面的例子中,要求用户输入终端类型。如果输入为vt100或vt102,将匹配模式‘vt100|vt102’,执行命令是设置TERM变量为vt100。如果用户输入与模式不匹配,*用来捕获输入,其中命令为将TERM设置为vt100。最后在case语句外,导出TERM变量
#!/bin/sh
echo "choose vt100,vt102,vt200"
echo -n "please select one: "
read TERM
case $TERM in
vt100|vt102)
TERM=vt100
;;
vt200)
TERM=vt200
;;
*)
TERM="VT"
;;
esac
echo "$TERM"
例题三:case的一个有效用法是提示用户响应以决定是否继续进程。这里提示输入y以继续处理,n退出。如果用户输入Y,y或yes,处理继续执行case语句后面部分。如果用户输入N,n或no或其他响应,用户退出脚本
#!/bin/sh
#author: li094
echo "Do you wish next"
read I
case $I in
Y|y|yes)
echo "OK"
;;
N|n|no)
echo "NO"
;;
*)
echo "unkown select"
exit
;;
esac
- 循环控制语句
for循环控制语句
for循环一般格式为:
do
command
command
...
done
当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的shell命令和语句。变量名为任何单词。In列表用法是可选的,如果不用它,for循环使用命令行的位置参数。
in列表可以包含替换、字符串和文件名,下面看一些例子
例题一:此例仅显示列表1 2 3 4 5,用变量名访问列表:
#!/bin/sh
#author: li0924
for i in
do
echo $i
done
例题二:对for循环使用ls命令;这个循环执行ls命令,打印当前目录下所有文件
#!/bin/sh
#author: li0924
for i in `ls`
do
echo $i
done
例题三:In列表用法是可选的,如果不用它,for循环使用命令行的位置参数
#!/bin/sh
#author: li0924
for i
do
echo "this is $i paramter"
done
例题四:用for循环备份所有文件,只需将变量作为cp命令的目标参数。这里有一变量.bak,当在循环中使用cp命令时,它作为此命令目标文件名。列表命令为ls。只针对普通文件;非文件夹
#!/bin/sh
#author: li0924
for i in `ls -l | awk '{if(substr($1,1,1)=="-") print $NF}'`
do
if cp $i $i.bak
then
exit
else
exit
fi
done
for循环嵌入
嵌入循环可以将一个for循环嵌在另一个for循环内
do
for varname2 in list2
do
command
. . .
done
done
while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据,其格式为:
do
command
command
...
done
虽然通常只使用一个命令,但在while和do之间可以放几个命令。命令通常用作测试条件。只有当命令的退出状态为0时,do和done之间命令才被执行,如果退出状态不是0,则循
环终止。命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假
题目一:以下是一个基本的while循环,测试条件是:如果COUNTER小于5,那么条件返回真。COUNTER从0开始,每次循环处理时, COUNTER加1
#!/bin/sh
#author: li0924
counter=
while [ $counter -lt ]
do
echo "$counter"
counter=`expr $counter + `
done
题目二:while循环最常用于从一个文件中读取数据,因此编写脚本可以处理这样的信息。假定要从下面包含雇员名字、从属部门及其ID号的一个文件中读取信息文件worker.txt
Louise Conrad:Accounts:ACC8987
Peter Jamas:Payroll:PR489
Fred Terms:Customer:CUS012
James Lenod:Accounts:ACC887
Frank Pavely:Payroll:PR489
#!/bin/sh
#author: li0924
while read list
do
echo $list;
done < worker.txt
例题三:输出时要去除冒号域分隔符,可使用变量IFS。在改变它之前保存IFS的当前设置。然后在脚本执行完后恢复此设置。使用IFS可以将域分隔符改为冒号而不是空格或tab键
#!/bin/sh
#author: li0924
#SAVEIFS=$IFS
IFS=:
while read name dept id
do
echo -e "$name\t$dept\t$id"
done < worker.txt
#IFS=$SAVEIFS
注意:只要理解上面脚本的意思就行了;完全可以用awk来代替!
总结:以上代码都很简单;容易理解学习!都经过测试!
SHELL编程笔记(二)之shell流程控制的更多相关文章
- 【shell编程】之基础知识-流程控制
和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...
- 第10章 Shell编程(4)_流程控制
5. 流程控制 5.1 if语句 (1)格式: 格式1 格式2 多分支if if [ 条件判断式 ];then #程序 else #程序 fi if [ 条件判断式 ] then #程序 else # ...
- 【转】shell学习笔记(六)——流程控制之for循环
基本语法格式: for 变量 in 列表 do 命令行(通常用到循环变量) done ********Linux Shell for循环写法总结******** for((i=1;i<</ ...
- 【转】shell学习笔记(七)——流程控制之while
while do done, until do done (不定回圈) 当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止 while [condition] ...
- linux bash shell编程之参数变量和流程控制。
参数变量:用来向脚本中传递参数 我们在执行脚本的时候可以在其后面加入一些参数,通常来说这些参数与脚本中变量为对应关系. start.sh argu1 argu2 引用方式: $1,,2,……${10} ...
- SQL编程篇 (二) 定义与流程控制
分类: sql编程:标准的sql 编程 * 纯sql 在标准的编程中又分为 sqlserver-->T-sql oracle-->pl-sql(扩展) 变量:在使用变量之前先定义 声明变量 ...
- Shell编程笔记
Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理. 修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...
- shell编程(二)
第三十二次课 shell编程(二) 目录 十五.shell中的函数 十六.shell中的数组 十七.告警系统需求分析 十八.告警系统主脚本 十九.告警系统配置文件 二十.告警系统监控项目 二十一.告警 ...
- Shell学习(二)Shell变量
一.Shell变量 变量的定义 例子: my_job="Learn Shell" PS:变量名和等号之间不能有空格!!! 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头 ...
- linux下的Shell编程(3)shell里的流程控制
if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...
随机推荐
- Sql Server之旅——第五站 确实不得不说的DBCC命令
原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ...
- 对于VS相关的插件
原文:对于VS相关的插件 本人使用这款IDE时间不长,但是很佩服其强大的功能. 编写代码时候的插件辅助,确实让人很舒服. 网上找了好多,有几个是很有用的,但是忘记了他们的网址,再次,总结下,也是给自己 ...
- iOS开发- 拨打电话总结
关于iOS应用拨打电话, 我所知道的有3种办法, 详细例如以下: 一.利用openURL(tel) 特点: 直接拨打, 不弹出提示. 而且, 拨打完以后, 留在通讯录中, 不返回到原来的应用. //拨 ...
- 终于会用c#中的delegate(委托)和event(事件)了
一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e ...
- [POJ 3311]Hie with the Pie——谈论TSP难题DP解决方法
主题连接: id=3311">http://poj.org/problem?id=3311 题目大意:有n+1个点,给出点0~n的每两个点之间的距离,求这个图上TSP问题的最小解 ...
- django csrf_token生成
django模板中生成csrf_token的不同方式 系统环境 CENTOS 6.4 python 2.7.6 django 1.7.1 当post提交表单的的时候,是需要 csrf_token的, ...
- SVN提交忽略*.class、.classpath、.mymetadata、.project、.settings、.myeclipse和其他非版本控制文件
1.忽略*.class 在TortoiseSVN -->setting(设定)--规设置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrZTY ...
- Redis源代码分析(一)--Redis结构解析
从今天起,本人将会展开对Redis源代码的学习,Redis的代码规模比較小,很适合学习,是一份很不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望终于能把他啃完吧,C语言好久不 ...
- MS SQL Server递归查询
原文:MS SQL Server递归查询 刚才在论坛上看到网友一个要求.参考如下,Insus.NET分析一下,可以使用MS SQL Server的递归查询,得到结果.准备一张表: 根据网友提供的数据, ...
- Python 2.7 Exception格式化工具
首先说一个发现: try: 抛错误,抛异常 except Exception as e: 都被这里抓住了 except Error as e: 这里啥事都没了 然后,说说Exception as e的 ...