Shell编程之case多分支语句、循环语句(for、while等)、Shell函数、Shell数组

case多分支语句

case语句的结构:

针对变量的不同取值,分别执行不同的命令列

case  变量值  in
模式1)
    命令序列1
        ;;
模式2)
    命令序列2
    ;;
.....
*)
默认命令序列
esac

示例

字符类型识别:

  • 提示用户输入一个字符;
  • 判断出该字符是字母、数字或者其他字符。

脚本如下:

[[email protected] opt]# vim test01.sh
#!/bin/bash
read -p "请输入一个字符:" key
case $key in
[a-z]|[A-Z])
        echo "你输入的是字母"
;;
[0-9])
        echo "你输入的是数字"
;;
*)
        echo "你输入的是特殊符号"
esac
执行结果如下:

[[email protected] opt]# chmod +x test01.sh
[[email protected] opt]# ./test01.sh
请输入一个字符:3
你输入的是数字
[[email protected] opt]# ./test01.sh
请输入一个字符:d
你输入的是字母
[[email protected] opt]# ./test01.sh
请输入一个字符:#
你输入的是特殊符号
[[email protected] opt]# 

循环语句

for循环语句:

循环结构:读取不同的变量值,用来逐个执行同一组命令。

for  变量名  in  取值列表
do
    命令序列
done

示例1

批量添加用户:

  • 用户名存放在users.txt文件中,每行一个;
  • 初始密码均设为123456;
  • 验证脚本。

具体实验如下

[[email protected] opt]# tail -5 /etc/passwd
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
jiang:x:1000:1000:jiang:/home/jiang:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[[email protected] opt]# vim users.txt
[[email protected] opt]# cat users.txt
zhangsan
lisi
wangwu
zhaoliu
[[email protected] opt]# vim test02.sh
[[email protected] opt]# cat test02.sh                                         //shell脚本如下
#!/bin/bash
TMP=$(cat /opt/users.txt)
for USER in $TMP
do
    useradd $USER && echo "123456" | passwd --stdin $USER &> /dev/null
done
[[email protected] opt]# chmod +x test02.sh
[[email protected] opt]# ./test02.sh
[[email protected] opt]# tail -5 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
wangwu:x:1003:1003::/home/wangwu:/bin/bash
zhaoliu:x:1004:1004::/home/zhaoliu:/bin/bash
[[email protected] opt]#
[[email protected] opt]# su zhangsan
[[email protected] opt]$ su lisi
密码:
[[email protected] opt]$

示例2

根据IP地址检查主机状态:

  • IP地址存放在ipadds.txt文件中,每行一个;
  • 使用ping命令检测各主机的连通性。

shell脚本如下:

#!/bin/bash
TMP=$(cat /opt/ipadds.txt)
for USER in $TMP
do
 ping -c 3 -i 0.2 -w 3 $USER &> /dev/null
 if [ $? -eq 0 ]
 then
  echo "$USER is up"
 else
  echo "$USER is down"
 fi
done

while循环语句:

循环结构:重复测试某个条件,只要条件成立则反复执行。

while  条件测试操作
do
    命令序列
done

示例1

批量添加用户:

  • 用户名称以stu开头,按数字顺序进行编号;
  • 一共添加10个用户,即stu1、 stu2、....stu20;
  • 初始密码均设为123456。

shell脚本如下:

#!/bin/bash
PRE="stu"
num=1
while [ $num -le 10 ]
do
  useradd $PRE$num
  echo "123456" | passwd --stdin $PRE$num &> /dev/dull
 let num++
done

示例2

猜商品价格:

  • 通过变量RANDOM获得随机数;
  • 提示用户猜测并记录次数,猜中后退出循环。

shell脚本如下:

#!/bin/bash
TIMES=0
PRICE=$(expr $RANDOM % 1000)
while true
do
read -p "请猜价格(0-999):" money
let TIMES++
     if [ $money -gt $PRICE ]
     then
         echo "您猜的太大"
     elif [ $money -lt $PRICE ]
     then
         echo "您猜的太小"
     else
         echo "您猜对了,正确价格为:$num"
         echo "您一共猜了$TIMES次"
     break
     fi
done 

until循环语句:

循环结构:重复测试某个条件,只要条件不成立则反复执行。

until  条件测试操作
do
   命令序列
done

示例1

计算1~50的和值:

  • 通过循环累加的方式计算1~50的和值。

实验如下:

[[email protected] opt]# vim test04.sh
[[email protected] opt]# cat test04.sh
#!/bin/bash
i=0
sum=0
until [ $i -eq 51 ]
do
    let sum+=i
    let i++
done
echo $sum
[[email protected] opt]# chmod +x test04.sh
[[email protected] opt]# ./test04.sh
1275
[[email protected] opt]# 

示例2
为指定用户发送在线消息:

  • 若用户不在线(未登录系统),则每10分钟试一次, 直至用户登录系统后在发送信息;
  • 用户名与消息通过位置参数传递给脚本。

脚本如下:

#!/bin/bash
username=$1
#判断信息格式
if [ $# -lt 1 ];then
        echo "Usage:`basename $0`<username> [<message>]"
        exit 1
fi
#判断用户是否存在
if grep "^$username:" /etc/passwd > /dev/null
then :
else
        echo "用户不存在"
        exit 1
fi
#用户是否在线,如果不在线每5秒联系一次
until who|grep "^$username" > /dev/null
do
        echo "用户不在线"
        sleep 5
done
mes=$*
echo $mes | write $username

Shell函数

Shell函数定义:

将命令序列按格式写在一起可方便重复使用命令序列。

[ function ] 函数名(){
    命令序列
        [return x]
}                                              //使用return或exit可以显式地结束函数

调用函数的方法:

函数名 [参数1] [参数2]

示例

两个数字求和:

  • 通过sum () {}定义函数;
  • 通过调用函数求两个数和。

实验如下:

[[email protected] opt]# vim test06.sh
[[email protected] opt]# cat test06.sh
#!/bin/bash
sum(){
    s=`expr $1 + $2`
    echo $s
}
[[email protected] opt]# chmod +x test06.sh
[[email protected] opt]# ./test06.sh
[[email protected] opt]# sum 5 6
11
[[email protected] opt]#

Shell数组

应用场景包括:

  • 获取数组长度
  • 获取元素长度
  • 遍历元素
  • 元素切片
  • 元素替换
  • 元素删除
    ......

数组定义方法:

  • 方法一

数组名= (value0 value1 value2 ..)

  • 方法二

数组名= ([0]=value [1]=value [2]=value ...) //数组元素之间使用空格隔开

  • 方法三
列表名="value0 value1 value2 ..."
数组名= ($列表名)
  • 方法四
数组名[0]="value”
数组名[1]="value"
数组名[2]="value"

数组包括的数据类型:

  • 数值类型
  • 字符类型:使用" "或‘ ‘定义

获取数组长度:

格式:${#数组名[@\*]}

实例:
[[email protected] ~]# arr_ nymber=(1 2 3 4 5);
[[email protected] ~]#arr_ length=${#arr_ number[*]}
[[email protected] ~]# echo $arr length
5

读取某下标的赋值:

格式:${数组名[下标]}

实例:
[[email protected] ~]#arr_ index2=${arr_ number[2]}
[[email protected] ~]# echo $arr_ index2
3

数组遍历:

[[email protected] ~]# for v in
${arr_ number[@]}
> do
>     echo $V
> done
1
2
3
4
5

Shell脚本调试

echo命令

bash命令

语法:sh [-nvx] 脚本名

常用选项:

-n:不执行脚本,仅检查语法。没有语法问题不显示任何内容,有问题提示报错。
-v:执行脚本时,先显示脚本内容,然后执行脚本。存在错误时,给出错误提示。
-x:将执行的脚本内容输出到屏幕上。

set命令

set -x:开启调节模式
set +x:关闭调节模式

原文地址:https://blog.51cto.com/14449541/2442158

时间: 2024-10-09 23:17:53

Shell编程之case多分支语句、循环语句(for、while等)、Shell函数、Shell数组的相关文章

shell编程之case分支语句

shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 如果里面匹配到固定值:或某个变量存在多中取值,需要对其中的每一个取值分别执行不同的命令序列. case只是判断一个变量的不同取值. case的模式: 执行流程: 首先使用"变量值"与模式1进行比较,如果取值相同就执行模式1的命令序列1,直到遇见" ;; "后跳转到es

Shell编程之case语句与循环语句

case语句分支 1.case语句的结构 case 变量值 in模式 1)命令序列 1;;模式 2)命令序列 2;;......*)默认命令序列esac case分支语句的结构图使用case分支语句的注意点:1.case行尾必须为单词"in",每一个模式必须以右括号")"结束.2.双分号";;"表示命令序列的结束.3.模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以用竖杠符号"|"表示

shell编程之case语句

bash脚本编程: case语句: 多分支if语句: if CONDITION1; then 分支1 elif  CONDITION2; then 分支2 ... else CONDITION; then 分支n fi 示例1:显示一个菜单给用户: cpu) display cpu information mem) display memory information disk) display disks information quit) quit 要求:(1) 提示用户给出自己的选择: (

SHELL编程之case与函数

一.case语句概述 使用case语句改写if多分支可以使脚本结构更加清晰.层次分明 针对变量不同取值,执行不同的命令序列 case语句结构如下: case 变量值  in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; *) 默认命令序列 esac 1 #!/bin/bash 2 read -p "请输入一个字符: " key 3 case "$key" in 4 [a-z]|[A-Z]) #假如变量$key在26个大小写英文字母中 5 echo &quo

shell编程之if语句

目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other shell编程之if判断 1.整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a&

Shell编程之Expect免交互

Shell编程之Expect免交互 Expect概述 Expect安装 Expect基本命令 Expect执行方式 Expect案例 Expect概述 Expect Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题.对于大规模的linux运维很有帮助 在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息.为了模拟这种输入,可以使

shell脚本中用到的条件和循环语句

本博文介绍一下shell脚本中常用的条件和循环语句: 条件语句: 循环语句: 示例: if语句: eg1. eg2. 2.case语句: 简单的case语句: 配合循环的case语句: 3.for语句: 简单的for语句:eg1. eg2. 和case搭配的for语句:eg3. 4.while语句: eg1. eg2. 5.util语句: 6.select语句:

shell编程之array

变量 : 内存空间 类型 shell编程中所有变量类型为字符类型array 数组 数组中变量叫做element (元素) ,数组中每个元素都用索引位置来标注声明数组declare -a ARRAY_NAME赋值方法1 :AA[0]=jerry赋值方法2 :br/>AA={jerry,tom,lucy}数组实例![](https://s1.51cto.com/images/blog/201907/09/d85fa8a4c0a1da0c0a4e8975ba9d285f.png?x-oss-proce

无标题文章shell编程之Expect免交互

shell编程之Expect免交互 前言 一:Expect概述 Expect是建立在tcl基础上的一个工具,Expect是用来进行自动化控制和测试的工具.主要解决shell脚本中不可交互的问题,对于大规模的linux运维很有帮助 在Linux运维和开发中,我们经常需要远程登录服务器进行操作,在登录的过程是一个交互的过程,可能会需要输入yes/no password等信息. 为了模拟这种输入,可以使用Expect脚本 二:Expect基本命令 2.1:Expect安装 系统一般不自带,需要自己安装