Shell if、for、while流程语句以及整数字符串判断比较的实例详解

前言:

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

一,shell的流程语句

1,条件语句if else if

示例代码:

[root@squid-2 script]# cat s1.sh

#!/bin/bash

echo "Please choose project:"

echo "1:zhu  2:sha"

read project_no

if [ $project_no = "1" ];then

echo "111111"

elif [ $project_no = "2" ];then

echo "222222"

else echo "error"

fi

[root@squid-2 script]#

执行过程如下:

[root@squid-2 script]# sh s1.sh

Please choose project:

1:zhu 2:sha

1

111111

[root@squid-2 script]# sh s1.sh

Please choose project:

1:zhu 2:sha

2

222222

[root@squid-2 script]# sh s1.sh

Please choose project:

1:zhu 2:sha

3

error

[root@squid-2 script]#

2,for 循环

2.1 for i in

脚本如下:

[root@squid-2 script]# cat host_list.txt

192.168.1.10

192.168.1.11

192.168.1.12

192.168.1.13

[root@squid-2 script]#

测试执行结果:

[root@squid-2 script]# sh s21.sh

the host ip address is: 192.168.1.10

the host ip address is: 192.168.1.11

the host ip address is: 192.168.1.12

the host ip address is: 192.168.1.13

[root@squid-2 script]#

2.2 for((赋值;条件;运算语句))

脚本代码:

[root@squid-2 script]# cat s22.sh

for((i=1;i<=10;i++));do

echo "the loop number i: $i";

done;

[root@squid-2 script]#

执行结果:

[root@squid-2 script]# sh s22.sh

the loop number i: 1

the loop number i: 2

the loop number i: 3

the loop number i: 4

the loop number i: 5

the loop number i: 6

the loop number i: 7

the loop number i: 8

the loop number i: 9

the loop number i: 10

[root@squid-2 script]#

3,while循环使用

条件语句结构:

while

do

action

done;

测试脚本:

[root@squid-2 script]# cat s3.sh

#!/bin/sh

i=10;

while [[ $i -gt 5 ]];do

echo"the loop number of while case is: $i";

((i--));

done;

[root@squid-2 script]

执行结果:

[root@squid-2 script]# sh s3.sh

the loop number of while case is: 10

the loop number of while case is: 9

the loop number of while case is: 8

the loop number of while case is: 7

the loop number of while case is: 6

[root@squid-2 script]#

4,until循环语句

示例脚本:

[root@squid-2 script]# cat s4.sh

#!/bin/sh

a=1;

until [[ $a -gt 6 ]];do

echo"the until number is: $a";

((a++));

done;

[root@squid-2 script]#

执行结果:

[root@squid-2 script]# sh s4.sh

the until number is: 1

the until number is: 2

the until number is: 3

the until number is: 4

the until number is: 5

the until number is: 6

[root@squid-2 script]#

5,shell选择语句

5.1,使用case选择语句使用(case/esac)

语法结构:

case $arg in

pattern | sample) # arg in pattern or sample

;;

pattern1) # arg in pattern1

;;

*) #default

;;

esac

说明:pattern1 是正则表达式,可以用下面字符:

*       任意字串

?       任意字元

[abc]  a, b, 或c三字元其中之一

[a-n]   从a到n的任一字元

|       多重选择

代码脚本:

[root@squid-2 script]# cat s51.sh

#!/bin/sh

case $1 in

start | begin)

echo "start something"

;;

stop | end)

echo "stop something"

;;

*)

echo "Ignorant"

;;

esac

[root@squid-2 script]#

PS:执行结果,这里需要带入参数,参数值就在)前面的start、begin、stop、end之内,如果带入别参数,则返回"Ignorant":

[root@squid-2 script]# sh s51.sh start

start something

[root@squid-2 script]# sh s51.sh begin

start something

[root@squid-2 script]# sh s51.sh end

stop something

[root@squid-2 script]# sh s51.sh stop

stop something

[root@squid-2 script]# sh s51.sh test1

Ignorant

5.2,select语句使用方法(产生菜单选择)

语法结构:

select 变量name  in seq变量

do

action

done

代码如下:

cat s52.sh

#!/bin/sh

select param in "begin""end" "exit"

do

case $param in

"begin")

echo "start something"

;;

"end")

echo "stop something"

;;

"exit")

echo "exit"

break;

;;

*)

echo "Ignorant"

;;

esac

done;

执行结果:

[root@squid-2 script]# sh s52.sh begin

1) begin

2) end

3) exit

#? 1

start something

#? 2

stop something

#? 3

exit

[root@squid-2 script]#

PS:执行的时候,只有输入exit,才能退出来执行小窗口。

说明:select是循环选择,一般与case语句使用。

二,shell语句的比较操作符

1,整数比较

规则说明:

-eq      等于                  if [ "$a" -eq "$b" ]

-ne      不等于                if [ "$a" -ne "$b" ]

-gt      大于                  if [ "$a" -gt "$b" ]

-ge      大于等于              if [ "$a" -ge "$b" ]

-lt      小于                    if [ "$a" -lt "$b" ]

-le      小于等于               if [ "$a" -le "$b" ]

<        小于(需要双括号)           (( "$a"< "$b" ))

<=       小于等于(...)                (("$a" <= "$b" ))

>        大于(...)                    (("$a" > "$b" ))

>=       大于等于(...)                (("$a" >= "$b" ))

PS:小数据比较可使用AWK

示例代码:

[root@squid-2 script]# cat com1.sh

a=$1

b=$2

if [ "$a" -eq "$b" ];then

echo"a = b true."

elif [ ! "$a" -gt "$b" ];then

echo"a > b true."

else echo "a < b true."

fi

[root@squid-2 script]#

测试结果如下:

[root@squid-2 script]# sh com1.sh 1 1

a = b true.

[root@squid-2 script]# sh com1.sh 1 2

a > b true.

[root@squid-2 script]# sh com1.sh 1 0

a < b true.

[root@squid-2 script]#

2,字符串比较

2.1,规范以及使用

规则说明:

=     等于           if [ "$a"= "$b" ]

==    与=等价

!=    不等于         if [ "$a" ="$b" ]

<     小于,在ASCII字母中的顺序:

if [[ "$a" < "$b" ]]

if [ "$a" \< "$b" ]         #需要对<进行转义

>     大于

-z    字符串为null,即长度为0

-n    字符串不为null,即长度不为0

示例代码:

[root@squid-2 script]# cat com2.sh

a=$1

b=$2

# 1 the first method to implement

if [ "$a"x = "$b"x ];then

echo"a = b"

elif [ ! "$a"x  = "$b"x ]; then

echo"a != b"

else echo "others"

fi

# 2 the second method to implement

if [ "$a"x == "$b"x ];then

echo "a = b"

elif [ "$a"x  != "$b"x ]; then

echo "a != b"

else echo "others"

fi

测试执行结果:

[root@squid-2 script]# sh com2.sh ccb aaa

a != b

a != b

[root@squid-2 script]# sh com2.sh ccb ccb

a = b

a = b

[root@squid-2 script]#

[root@squid-2 script]#

2.2,需要注意的地方

相等判断需要注意的地方:

比较两个字符串是否相等的办法是:

if [ "$a"x = "b"x ];then

这里的关键有几点:

1 使用单个等号

2 注意到等号两边各有一个空格:这是unix shell的要求

3 注意到"$a"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = bx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected

[[ $a == z* ]]   # 如果$a以"z"开头(模式匹配)那么将为true

[[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true

[ $a == z* ]     # File globbing 和word splitting将会发生

[ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true

关于File globbing:

一点解释,关于Fileglobbing是一种关于文件的速记法,比如"*.c"就是,再如~也是. 
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

特殊字符的比较:
!= 不等于,如:if [ "$a" != "$b" ] 
这个操作符将在[[]]结构中使用模式匹配. 
< 小于,在ASCII字母顺序下.如: 
if [[ "$a" < "$b" ]] 
if [ "$a" \< "$b" ] 
注意:在[]结构中"<"需要被转义. 
> 大于,在ASCII字母顺序下.如: 
if [[ "$a" > "$b" ]] 
if [ "$a" \> "$b" ] 
注意:在[]结构中">"需要被转义.

-z 字符串为"null".就是长度为0. 
-n 字符串不为"null" 
注意: 
使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z 
或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可 以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯。

2.3,判断字符串是否空

示例代码:

[root@squid-2 script]# cat com3.sh

#!/bin/bash

a=$1

if [ -z "$a" ]; then

echo"a is empty."

else echo "a is a object."

fi

[root@squid-2 script]

测试执行结果:

[root@squid-2 script]# sh com3.sh a

a is a object.

[root@squid-2 script]# sh com3.sh

a is empty.

[root@squid-2 script]#

3,文件判断

规则说明:

-e                         文件存在
-a                         文件存在(已被弃用)
-f                         被测文件是一个regular文件(正常文件,非目录或设备)
-s                         文件长度不为0
-d                         被测对象是目录
-b                         被测对象是块设备
-c                         被测对象是字符设备
-p                         被测对象是管道
-h                         被测文件是符号连接
-L                         被测文件是符号连接
-S(大写)                   被测文件是一个socket
-t                         关联到一个终端设备的文件描述符。用来检测脚本的stdin[-t0]或[-t1]是一个终端
-r                         文件具有读权限,针对运行脚本的用户
-w                         文件具有写权限,针对运行脚本的用户
-x                         文件具有执行权限,针对运行脚本的用户
-u                         set-user-id(suid)标志到文件,即普通用户可以使用的root权限文件,通过chmod +s file实现
-k                         设置粘贴位
-O                         运行脚本的用户是文件的所有者
-G                         文件的group-id和运行脚本的用户相同
-N                         从文件最后被阅读到现在,是否被修改

f1-nt f2                   文件f1是否比f2新
f1 -ot f2                   文件f1是否比f2旧
f1 -ef f2                   文件f1和f2是否硬连接到同一个文件

 

示例脚本代码:

[root@squid-2 script]# cat com4.sh

#!/bin/bash

a=$1

file=$2

if [ -d $a ]; then

echo"it is a directory."

elif [ -f "$a" ]; then

echo"it is a file."

else echo "no parameter."

fi

 

测试运行结果如下:

[root@squid-2 script]# sh com4.sh log1

it is a file.

[root@squid-2 script]# sh com4.sh old

it is a directory.

[root@squid-2 script]#

参考资料:

http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html

http://blog.csdn.net/yf210yf/article/category/1475895

(0)

相关推荐

  • squid代理局域网服务器访问公网【转】

    首先有两台服务器A.B,其中A为局域网,B有公网.A配置(内网IP172.19.58.202\系统CentOS7.4),B配置(内网IP172.19.58.201\系统CentOS7.4).现在A服务 ...

  • bash教程摘要

    若想知道您的操作系统支持哪些 Shell 类型,可在终端中输入命令:$ cat /etc/shells显示当前目录名 pwd我们可以使用ls -l命令来罗列出所有文件和目录使用cd命令移动至目标目录. ...

  • Linux学习Day6:编写Shell脚本、配置计划任务

    Shell脚本命令的工作方式有两种:交互式(Interactive):用户每输入一条命令就立即执行.批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命 ...

  • 一文读懂 Shell 中各种括号的作用

    作者:乌托邦2号 来源:https://reurl.cc/qmMvxg 一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本 ...

  • Shell—定时任务(crontab)

    如何让shell脚本每天定时执行? 1.新建需要定时执行的shell脚本,这里为date.sh脚本. #!/bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/us ...

  • 实例详解:你们一直想看的选股流程,细品!

    防骗小贴士:正规的证券交易只能认准上海和深圳两家交易所,任何许诺你高额回报,让你转账去其他平台,特别是让你下什么app要转钱的,无论是原油.期货.博彩.虚拟币.假私募.假券商.假港股.场外配资还是别的 ...

  • 从组织结构、流程梳理到责权手册!万字长文,详解组织的运作系统及运行机制

    文 / 张小峰,华夏基石副总裁 来源:HR赋能工坊 华夏基石e洞察已获授权,文章仅代表作者本人观点 战略决定组织,组织影响战略.作为HR,高阶的技能就是组织结构的优化和调整了.当然,我们在谈组织时,不 ...

  • 给排水工程怎么干?全流程施工详解!

    来源:建筑工程鲁班联盟 如有侵权,请联系删除 正文如下: 给排水工程是机电安装五大分部之一,也是贯穿建筑工程施工全过程的重要内容,本文是基于工程实例对给排水施工工艺的全流程解读,可供大家参考实施! 给 ...

  • 给排水工程全流程施工详解,现场就是这样干!

    筑龙暖通 公众号 来源:建筑工程鲁班联盟 如有侵权,请联系删除 给排水工程是机电安装五大分部之一,也是贯穿建筑工程施工全过程的重要内容,本文是基于工程实例对给排水施工工艺的全流程解读,可供大家参考实施 ...

  • 5步详解冷锅串串制作流程~夏日热卖单品~

    夏日蓉城的餐饮市场,要说上座率较高的,除了特色饮食.品牌中餐,剩下的当属火锅和串串了.而相比围炉而坐的热锅串串,在逐渐炎热的天气里,冷锅串串更加受到消费者们的青睐. 01 提前准备工作 1. 熬制鲜汤 ...

  • 青岛长期护理保险新政4月起实施,办理流程、标准详解

    经评估三级以上的失能人员和五级的失智人员可申请护理保险待遇,参保职工的基本生活照料费每月最高可报销1350元,生活照料待遇自5月1日起开始享受--青岛"全人全责"新型长期护理保险制 ...

  • 海口换驾驶证去哪里办?海口更换驾驶证材料流程地点详解

    来源:购车之家    2018/5/22 13:25:55 [购车之家 海南车讯]2018年5月22日,从海口市交警支队获悉,很多车主驾驶证到期后不知道怎么更换驾驶证,而在海口地区的拥有海口户口的海口 ...

  • 破产重整流程详解

    一.破产重整流程详解 重整申请一是重整对象的选择.需根据标的公司的股东人数.资产金额.员工人数.经营规模.经营范围.社会影响等指标来考察一个企业是否适合重整:二是明确重整的原因.不能清偿到期债务,并且 ...

  • 新南威尔士州悉尼房产交易流程及地产法规详解

    购买房产之前 你应该参考以下几点: 询问你的贷款经纪人你可以借多少钱,什么时候可以借钱. 把你存的钱和你借的钱相加,计算一下你能支付多少钱. 考虑贷款费用.关税.法律和搬迁成本. 选择买哪种房子 你应 ...