shell编程-判断语句与循环

一、if 判断

1 if … then … fi

单层
如果 是真的 那么 …

if [ 条件判断式 ];then
    当条件判断式成立时,可以进行的命令。
fi   # 结束这个判断语句结构

示例:
提示输入一个整数,程序判断输入的值是否大于 18

风格 1

#!/usr/bin/env sh

read -p "请输入一个整数:" num

if [ "$num" -gt 18 ];then
    echo "你输入的数值大于 18"
fi

echo "感谢您的使用,再见!"

风格2

#!/usr/bin/env sh

read -p "请输入一个整数:" num

if [ "$num" -gt 18 ]
then
    echo "你输入的数值大于 18"
fi

echo "感谢您的使用,再见!"

2 if … then … else…fi

多重、复杂条件判断式
如果 是真的 那么 … 否则 …

一颗红心,两手准备

if [ 条件判断式 ]; then
    当条件判断式成立时,可以进行的指令工作内容;
else
    当条件判断式不成立时,可以进行的指令工作内容;
fi

示例:
判断用户输出的字符串
输入 y
就输出文本内容 “script is running…”
否则输出文本内容 “STOP”

#!/usr/bin/bash
echo "Press y to continue"
read yn

# 上面代码等效于read -p "Press y to continue" yn
if [ "$yn" == "y" ];then
    echo "script is running..,"
else
    echo "stop"
fi

3 if … elif … elif … else … fi

多个条件判断 (if … elif … elif … else) 分多种不同情况执行

if [ 条件判断式一 ]; then
    当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
    当条件判断式二成立时,可以进行的指令工作内容;
else
    当条件判断式一与二均不成立时,可以进行的指令工作内容;

注意
elif 也是个判断式,因此出现 elif 后面都要接 then 来处理!但是 else 已经是最后的没有成立的结果了, 所以 else 后面并没有 then

示例

通过判断输入的整数,判断是什么常用服务

#!/usr/bin/env sh
read -p "请输入一个常用的服务默认端口号:"  port

if [ "$port" -eq 80 ];then
    echo "HTTP 服务"
elif [ "$port" -eq 3306 ];then
    echo "Mysql 服务"
elif [ "$port"  -eq  21 ] || [ "$port"  -eq  20 ];then
    echo "FTP 服务"
elif [ "$port" -eq 22 ];then
    echo "SSHD 服务"
elif [ "$port"  -eq 23 ];then
    echo "Telnet 服务"
else
   echo "未知服务"
fi

4 在判断中支持正则

使用双中括号 [[ ]]

匹配 使用 =~
比如: [[ "$val" =~ [a-z]+ ]]

=~ 表示 匹配
[a-z]+ 是正表达式,不需要用任何引号,用了引号就会被识别为普通字符串

不匹配 使用 !
比如: [[ ! "$val" =~ [0-9]+ ]]

示例

#!/usr/bin/env   sh
name=shark

if [[ "$name"  =~  [a-z]+ ]];then
   echo "ok"
fi


if [[ ! "$name" =~ [0-9]+ ]];then
   echo  "good"
fi

5 嵌套

#!/usr/bin/env sh
read -p "请输入一个常用的服务默认端口号:"  port

if [[ "$port" =~ [0-9]+ ]];then

    if [ "$port" -eq 80 ];then
        echo "HTTP 服务"
    elif [ "$port" -eq 3306 ];then
        echo "Mysql 服务"
    elif [ "$port"  -eq  21 ] || [ "$port"  -eq  20 ];then
        echo "FTP 服务"
    elif [ "$port" -eq 22 ];then
        echo "SSHD 服务"
    elif [ "$port"  -eq 23 ];then
        echo "Telnet 服务"
    else
       echo "未知服务"
    fi
else
    echo "nmber"
fi

二、 利用 case … esac 判断

1 基本语法

case  $变量名称 in       <==关键字为 case ,还有变量前有钱字号
  "第一个变量的值")       <==每个变量内容建议用双引号括起来,关键字则为小括号 )
	程序段
	;;                  <==每个类别结尾使用两个连续的分号来处理!
  "第二个变量的值")
	程序段
	;;
  *)                    <==最后一个变量内容都会用 * ,这里的 * 是通配符,
                           来代表所有其他值,不包含第一个变量内容与第二个
                           变量内容的其他程序运行段
	exit 1
	;;
esac                    <==反过来写,结束当前语句结构!

2 模式还可以是多个

#!/bin/bash
cat << EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
read -p "Your choice" choice
case $choice in
m|M)
        free -m
        ;;
d|D)
        df -h
        ;;
q|Q)
        exit
        ;;
*)
        eco "Invalid input"
        ;;
esac

再如:判断奇数还是偶数

#! /bin/bash

read -p "Input a number: " n
a=$[$n%2]

case $a in
    1)
        echo "The number is odd."
        ;;
    0)
        echo "The number is even."
        ;;
    *)
        echo "It's not a number!"
        ;;
esac

三、while … do … done (不确定的循环)

while [ condition ]  ==>中括号内的状态就是判断式
do                   ==> do 是循环的开始!
    命令或者代码
    命令或者其他逻辑语句
done                 ==> done 是循环的结束

1 计数
每次循环体执行完,while 都会检查条件是否为真,为真继续循环,否则终止循环。

n=0
while [ "$n" -lt 5 ]
do
   let n++
   echo "$n"
done

2 读文件

while read line
do
    echo $line
done < /etc/passwd

每次循环, 都会把 /etc/passwd 中的每一个行内容 赋值给变量 line

示例

$ cat db.sql
1 shark 18
2 xiguatian 20

$ cat  while-read-m.sh
while read id name age
do
    echo "$id | $name | $age"
done < db.sql

$ sh while-read-m.sh

1 | shark | 18
2 | xiguatian | 20
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值