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

2023-11-10

前言:

实际上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" ))

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" ]

      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

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26230597/viewspace-1265935/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26230597/viewspace-1265935/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 在字符串中找出连续最长的数字串

    描述 题目描述 请一个在字符串中找出连续最长的数字串 并把这个串的长度返回 如果存在长度相同的连续数字串 返回最后一个连续数字串 注意 数字串只需要是数字组成的就可以 并不要求顺序 比如数字串 1234 的长度就小于数字串 1359055
  • 01.个人项目难点汇总3 箭头流动及油管流动特效

    01 简单实例
  • 电商常用的数据分析指标

    一 流量指标 浏览量PV 用户访问页面的总数 用户每访问一个网页就算一个浏览量 同一个页面刷新一次也算一个浏览量 访客数UV 一般以天为单位来统计24小时内的UV总数 一天内重复访问的只能算一次 实时在线人数 指15分钟内在线UV数 平均在
  • UI素材

    什么是UI组件 UI 设计组件 UI KIT 直译过来就是用户界面成套元件 是界面设计常用控件或元件 组 是设计元素的组合方式 件 由不同的元件组成 组件的优势 1 保证一致性 Consistency 与现实生活一致 与现实生活的流程 逻辑
  • 本期特别推荐

    本文阅读时间 13分钟 本文将为你介绍9种机器学习入门项目创意 更有微软ATP助力你的学习之路 在机器学习领域有什么好的项目可以实操吗 有哪些经典小项目可以推荐学习呢 以下的项目将帮助你更好了解机器学习 步入AI领域的大门 鸢尾花分类项目
  • SSRF——服务端请求伪造

    什么是SSRF 服务器端请求伪造 SSRF 是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求的对其他网站进行攻击 利用一个可发起网络请求的服务当作跳板来攻击其他服务 ssrf有什么作用 一般用于探测内网端口及信息 查看文件 甚至可
  • spring与mybatis三种整合方法

    1 采用MapperScannerConfigurer 它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean spring mybatis xml
  • vhd win10系统蓝屏问题(inaccessible boot device/0x000000c1)

    我的win10 是安装在vhdx虚拟磁盘中 在安装云桌面软件后 重启无法进入win10系统 出现蓝屏现象 具体的报错信息为 inaccessible boot device或 0x000000c1 问题根源 根源是云桌面软件为了接管系统的u
  • JVM 虚拟机 ---> JVM 基础概念

    文章目录 JVM 虚拟机 gt JVM 基础概念 一 Java 跨平台 主要原因 二 JVM 的组成结构 三 Java 代码执行流程 四 JVM 的生命周期 JVM 虚拟机 gt JVM 基础概念 一 Java 跨平台 Java是一种可跨平
  • 详解K8s基本概念

    没等到风来 绵绵小雨 所以写个随笔 聊聊k8s的基本概念 k8s是一个编排容器的工具 其实也是管理应用的全生命周期的一个工具 从创建应用 应用的部署 应用提供服务 扩容缩容应用 应用更新 都非常的方便 而且可以做到故障自愈 例如一个服务器挂
  • 信息抽取之街道抽取

    如何从文本信息抽取出道路信息 问题 从给定的语料中抽取出相应的道路信息 数据 向塘北大道西50米 天龙路与龙华路交叉口北50米 观澜大道490号附近 成都市锦江区海椒市街13号附7号 玉兰西路 团结北路23号 湖塘镇火炬北路12号 昆明市晋
  • Linux在Docker中安装Gitlab

    1 安装Gitlab前先把git安装上 yum install y git 2 安装成功后查看git版本信息 git version 3 设置git的账户信息 git config global user name 名称 git confi
  • 在vue中怎么解决跨域问题(CORS)

    在Vue中解决跨域问题有多种方法 以下是几种常见的方法 1 代理服务器 在开发环境中 可以配置一个代理服务器来转发 API 请求 绕过浏览器的同源策略 可以使用 http proxy middleware 等中间件来实现代理配置 在 vue
  • 基于SSM+JSP的新闻发布管理系统

    项目技术栈 末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • 傅立叶变换小结

    文章目录 傅立叶何许人也 傅立叶分析是什么 傅立叶变换有什么用 傅立叶变换和拉普拉斯变换 傅立叶变换的类型和快速傅立叶变换 参考文献 由于学习雷达信号处理需要 自己把傅立叶变换好好看了一遍 本科的时候也学到过一点 但也早就还给老师了 毕竟不
  • Smart3D空三不过的解决办法

    Smart3D空三不过的解决办法 问题1 空三完成后提示有大量照片未参与重建 答案1 1 若测区无大面积同名点难以识别的地物地貌 例如水域 沙漠 玻璃等 出现大量照片未参与重建的情况一般是初始的 传感器尺寸 sensor size 或者 相
  • vue如何获取一个元素的高度

    Vue 中获取一个元素的高度可以使用 JavaScript 原生方法或者 Vue 内置的 refs 使用 JavaScript 原生方法 可以在 mounted 钩子函数中获取到元素 然后使用 offsetHeight 属性获取元素高度 m
  • 基于卷积的图像分类识别(二):ZFNet

    本专栏介绍基于深度学习进行图像识别的经典和前沿模型 将持续更新 包括不仅限于 AlexNet ZFNet VGG GoogLeNet ResNet DenseNet SENet MobileNet ShuffleNet Eifficient
  • git status提示detached HEAD解决办法

    有时候 需要查看某个Tag中的代码 就会使用git checkout tag name 切换到tag中 此时 如果使用git status来查看当前的状态时 会报detached HEAD的提示 detached HEAD表示当前的HEAD
  • [Shell] if、for、while流程语句以及整数字符串判断比较的实例详解

    前言 实际上Shell是一个命令解释器 它解释由用户输入的命令并且把它们送到内核 不仅如此 Shell有自己的编程语言用于对命令的编辑 它允许用户编写由shell命令组成的程序 Shell编程语言具有普通编程语言的很多特点 比如它也有循环结