shell流程控制与循环结构
本文主要介绍Shell脚本中的流程控制语句,包括if/else、case,循环语句包括for循环、while循环、until循环等内容。并通过简单实例介绍它们的使用方法。
if语句
(1)最简单的if语句。使用格式有2种方式,分别如下
使用格式1:
if [ 条件判断式 ];then
程序段
fi
使用格式2:
if [ 条件判断式 ]
then
程序段
fi
特别说明:
(1)建议使用格式1。格式1和格式2的区别是then重新换行以及是否带命令分隔符";"。
(2)if语句使用fi结尾。否则报错。
下面看一个简单示例。
#!/bin/bash num1=
num2=
if [ "${num1}" -lt "${num2}" ];then
echo "${num1} is less than ${num2}"
fi
(2)简单的if else语句,使用格式如下:
if [ 条件判断式 ];then
程序段
else
程序段
fi
使用if/else语句修改比较数值大小的实例,如下
#!/bin/bash num1=
num2=
if [ "${num1}" -lt "${num2}" ];then
echo "${num1} is less than ${num2}"
else
echo "${num1} is greater than ${num2}"
fi
(3)多分支的if else语句,使用格式如下:
if [ 条件判断式1 ];then
程序段
elif [ 条件判断式2 ];then
程序段
else
程序段
fi
继续修改比较数值大小的实例,代码如下
#!/bin/bash num1=
num2=
if [ "${num1}" -lt "${num2}" ];then
echo "${num1} is less than ${num2}"
elif [ "${num1}" -gt "${num2}" ];then
echo "${num1} is greater than ${num2}"
else
echo "${num1} is equal to ${num2}"
fi
case语句
case语句为多选择语句,可以用case语句匹配一个值或者一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
程序段1
;;
模式2)
程序段2
;;
……
*)
程序段n
;;
esac
模式可以是变量或常数,可以包含元字符。其中*表示任意字符、?表示任意单一字符、[..]表示范围中的任意字符。下面通过实例来了解case语句用法。
#!/bin/bash
read -p "Please input yes or no:" YN
case "${YN}" in
Yes)
echo "Input Yes"
;;
No)
echo "Input No"
;;
yes|YES)
echo "please input yes"
;;
NO|no)
echo "please input no"
;;
*)
echo "input error"
;;
esac
for循环
(1)最简单的for循环语句,使用格式如下:
for 变量名 in 值1 值2 值3 ... 值n
do
程序段
done
for循环工作时会对in后面的变量值逐一遍历取值并进入程序段操作。使用基本实例如下:
#!/bin/bash for i in $(seq )
do
echo $i
done
(2)for循环的第二种格式如下
for((初始值;限制值;执行步长))
do
程序段
done
该类型for循环适合数值方式的运算中。简单实例如下
#!/bin/bash for((i=;i<=;i++))
do
echo $i
done
while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据,使用格式如下:
while 命令
do
程序段
done
(1)打印1~100的整数
#!/bin/bash i=
while [ $i -le ]
do
echo $i
i=$(($i+))
done
(2)从文件中读取数据,打印每一行内容
#!/bin/bash while read line
do
echo $line
done < /etc/passwd
(3)从文件中读入,并赋值给对应的变量。假设student.txt文件中每一行包含3列分别为Name、Age、Address,字段分隔符为空格。
#!/bin/bash while read NAME AGE ADDRESS
do
echo "name=${NAME}"
echo "age=${AGE}"
echo "address=${ADDRESS}"
done < student.txt
(4)如果实例(3)中的student.txt文件字段分隔符为冒号":",可以使用变量IFS处理,处理方法如下:
#!/bin/bash OLD_IFS=$IFS
IFS=":" while read NAME AGE ADDRESS
do
echo "name=${NAME}"
echo "age=${AGE}"
echo "address=${ADDRESS}"
done < student.txt IFS=${OLD_IFS}
until循环
until循环执行一系列命令直至条件为真时停止。until循环会执行一次程序体再判断测试条件。测试条件为真,则执行退出。某些场景下,until循环会比while循环更好用。使用格式为如下:
until 命令
do
程序段
done
(1)打印1~100的整数
#!/bin/bash i=
until [ $i -gt ]
do
echo $i
i=$(($i+))
done
break和continue使用
有时需要基于某些准则退出循环或者跳过循环步。其中break命令允许跳出循环、continue用于跳出当次循环。
(1)打印小于50的整数。
#!/bin/bash i=
while [ $i -le ]
do
echo $i
i=$(($i+))
if [ $i -gt ];then
break
fi
done
(2)打印1-100以内的偶数。
#!/bin/bash i=
while [ $i -le ]
do
if [ $(expr $i % ) -eq ];then
echo $i
fi
i=$(($i+))
done
shell流程控制与循环结构的更多相关文章
- 053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结
053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结 本文知识点: 流程控制知识总结 流程控制知识总结 选择结构语句 循环结构语句 ...
- 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序
052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...
- 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1
051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...
- 050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句
050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句 本文知识点:continue语句 continue语句 continue ...
- 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...
- 048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...
- 047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用
047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用 本文知识点:嵌套while循环应用 什么是循环嵌套? 什么是循环嵌套? ...
- 046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项
046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项 本文知识点:for循环的注意事项 for循环的注意事项 for循环有3个 ...
- 045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围
045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围 本文知识点:for循环应用及局部变量作用范围 for循环 w ...
随机推荐
- 第16课 右值引用(3)_std::forward与完美转发
1. std::forward原型 template <typename T> T&& forward(typename std::remove_reference< ...
- pthread线程特定数据
举个栗子 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/t ...
- 通过mapreduce把mysql的数据读取到hdfs
前面讲过了怎么通过mapreduce把mysql的一张表的数据放到另外一张表中,这次讲的是把mysql的数据读取到hdfs里面去 具体怎么搭建环境我这里就不多说了.参考 通过mapreduce把mys ...
- CentOS7.4安装部署openstack [Liberty版] (一)
一.OpenStack简介 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. OpenStack是一个 ...
- .Net 大型分布式基础服务架构横向演变概述(转)
一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...
- Solr合并索引方式
索引合并并不会判断uniqueKey,所以主键有重复不会判断主键会重复. 官方的解释是不要有重复. 要合并索引,它们必须满足以下要求: 这两个索引必须兼容:它们的架构应该包含相同的字段,并且它们应该以 ...
- join,fromkeys(),深浅拷贝
1. 补充基础数据类型的相关知识点 1. str. join() 把列表变成字符串例 # s= "哈哈"# s1=s.join('-')# print(s1)# s="呵 ...
- linux中的IP地址的修改
一,图形界面,setup 二,修改文件 1,修改主机名字 vi /etc/sysconfig/network NETWORKING=yes #HOSTNAME=localhost.localdomai ...
- uva-10422-骑士-搜索题
题意: 给你一个5X5的图,棋盘上骑士的走法自己去百度,问能不能在10步内走到目标图, 解题思路: 从目标图开始往前走10步,保存所有能走到的图,然后输入,查找是否存在这个图,存在就是可以走到,不存在 ...
- Linux:DNS服务器搭建及配置
1.yum install -y bind bind-chroot bind-utils 2.编辑DNS主配置文件 vim /etc/named.conf 修改如下标红色处即可: options ...