Shell控制流程结构

  • 本章内容有:
       退出状态
       While、for和until loops循环
       If then else语句
       脚本中动作
       菜单
  • 条件控制语句
     If then else语句
    if语句测试条件,测试条件返回真(0)或假(1)后,可相应执行一系列语句。if语句结
    构对错误检查非常有用。其格式为:
if 条件1
then 命令1
elif 条件2
then 命令2
else 命令3
fi

让我们来具体讲解if语句的各部分功能。

 If 条件1 如果条件1为真
 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语句格式如下:

case 值in
模式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循环一般格式为:

for varname in list
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循环内

for varname1 in list1
do
for varname2 in list2
do
command 
. . .
done
done

while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据,其格式为:

while command
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流程控制的更多相关文章

  1. 【shell编程】之基础知识-流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...

  2. 第10章 Shell编程(4)_流程控制

    5. 流程控制 5.1 if语句 (1)格式: 格式1 格式2 多分支if if [ 条件判断式 ];then #程序 else #程序 fi if [ 条件判断式 ] then #程序 else # ...

  3. 【转】shell学习笔记(六)——流程控制之for循环

    基本语法格式: for 变量 in 列表 do 命令行(通常用到循环变量) done ********Linux Shell for循环写法总结******** for((i=1;i<</ ...

  4. 【转】shell学习笔记(七)——流程控制之while

    while do done, until do done (不定回圈) 当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止 while [condition] ...

  5. linux bash shell编程之参数变量和流程控制。

    参数变量:用来向脚本中传递参数 我们在执行脚本的时候可以在其后面加入一些参数,通常来说这些参数与脚本中变量为对应关系. start.sh argu1 argu2 引用方式: $1,,2,……${10} ...

  6. SQL编程篇 (二) 定义与流程控制

    分类: sql编程:标准的sql 编程 * 纯sql 在标准的编程中又分为 sqlserver-->T-sql oracle-->pl-sql(扩展) 变量:在使用变量之前先定义 声明变量 ...

  7. Shell编程笔记

    Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理.   修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...

  8. shell编程(二)

    第三十二次课 shell编程(二) 目录 十五.shell中的函数 十六.shell中的数组 十七.告警系统需求分析 十八.告警系统主脚本 十九.告警系统配置文件 二十.告警系统监控项目 二十一.告警 ...

  9. Shell学习(二)Shell变量

    一.Shell变量 变量的定义 例子: my_job="Learn Shell" PS:变量名和等号之间不能有空格!!! 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头 ...

  10. linux下的Shell编程(3)shell里的流程控制

    if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...

随机推荐

  1. Android-支付宝快捷支付

    支付宝的快捷支付Android版业务流程比較麻烦,出现的意外情况比較多.在此,简单说下开发流程以及出现错误的解决方式; 1.注冊支付业务.这里不在赘述.建立数据安全传输所须要的私钥公钥,这里採用的是R ...

  2. Prototype and Constructor in JavaScript

    The concept of prototype in JavaScript is very confusing, especially to those who come with a C++/JA ...

  3. RQNOJ PID3 / Jam的计数法

    题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...

  4. 使用Heartbeat实现双机热备

    使用Heartbeat实现"双机热备"或者称为"双机互备"heartbeat的工作原理:heartbeat最核心的包含两个部分,心跳监測部分和资源接管部分,心跳 ...

  5. SQL Profile (总结4)--使用演示示例

    前提:sql profile工具的相关视图 dba_sql_profile 10g: sys.sqlprof$attr  &  sqlprof$ 11g: sys.sqlobj$data  & ...

  6. cocos2dx 3.0 它 使用std::bind更换CC_CALLBACK_N

    在cocos2dx 3.0 版本号,回调函数本质4一个CC_CALLBACK_N 替换功能.N的回调函数的参数的数量的代表 1.让我们来看看这些CC_CALLBACK_N怎么用 比方action的回调 ...

  7. svnclient本地化和异常处理

    svn中国本土化,首次安装client.然后下载语言包的相应版本,然后将语言设置为英文! 我碰到汉化失败的案例:client与语言包版本号不匹配 之前安装的语言包: 下载相应语言包: 假设之前安装了, ...

  8. 数据持久化之SP的优化—送工具类

    第一点:sp存储的是键值对 getSharedPreferences 第一个參数是你保存文件的名字,第个是保存的模式一般能够默觉得0 先看普通 使用SP 存储String类型字符串吧 SharedPr ...

  9. Cassandra C++/NodeJs开发环境

    工作的需要,开始更多地倾向于去中心化的结构,目前看来Cassandra算是去中心化DB中性能/管理最热门的选择,崇尚其P2P的理念. 自身原因对JAVA不擅长(周围写C的好少),还是更热衷于C++/J ...

  10. UITableView的常用方法

    一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtI ...