针对变量的不一样取值,分别执行不一样的命令列shell
case 变量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; ..... *) 默认命令序列 esac
示例:apache
字符类型识别:编程
脚本以下:vim
[root@localhost opt]# vim test01.sh #!/bin/bash read -p "请输入一个字符:" key case $key in [a-z]|[A-Z]) echo "你输入的是字母" ;; [0-9]) echo "你输入的是数字" ;; *) echo "你输入的是特殊符号" esac
执行结果以下: [root@localhost opt]# chmod +x test01.sh [root@localhost opt]# ./test01.sh 请输入一个字符:3 你输入的是数字 [root@localhost opt]# ./test01.sh 请输入一个字符:d 你输入的是字母 [root@localhost opt]# ./test01.sh 请输入一个字符:# 你输入的是特殊符号 [root@localhost opt]#
循环结构:读取不一样的变量值,用来逐个执行同一组命令。数组
for 变量名 in 取值列表 do 命令序列 done
示例1:bash
批量添加用户:tcp
具体实验以下:ide
[root@localhost 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 [root@localhost opt]# vim users.txt [root@localhost opt]# cat users.txt zhangsan lisi wangwu zhaoliu [root@localhost opt]# vim test02.sh [root@localhost 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 [root@localhost opt]# chmod +x test02.sh [root@localhost opt]# ./test02.sh [root@localhost 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 [root@localhost opt]# [root@localhost opt]# su zhangsan [zhangsan@localhost opt]$ su lisi 密码: [lisi@localhost opt]$
示例2:函数
根据IP地址检查主机状态:post
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 条件测试操做 do 命令序列 done
示例1:
批量添加用户:
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:
猜商品价格:
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 条件测试操做 do 命令序列 done
示例1:
计算1~50的和值:
实验以下:
[root@localhost opt]# vim test04.sh [root@localhost opt]# cat test04.sh #!/bin/bash i=0 sum=0 until [ $i -eq 51 ] do let sum+=i let i++ done echo $sum [root@localhost opt]# chmod +x test04.sh [root@localhost opt]# ./test04.sh 1275 [root@localhost opt]#
示例2:
为指定用户发送在线消息:
脚本以下:
#!/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
将命令序列按格式写在一块儿可方便重复使用命令序列。
[ function ] 函数名(){ 命令序列 [return x] } //使用return或exit能够显式地结束函数
函数名 [参数1] [参数2]
示例:
两个数字求和:
实验以下:
[root@localhost opt]# vim test06.sh [root@localhost opt]# cat test06.sh #!/bin/bash sum(){ s=`expr $1 + $2` echo $s } [root@localhost opt]# chmod +x test06.sh [root@localhost opt]# ./test06.sh [root@localhost opt]# sum 5 6 11 [root@localhost opt]#
数组名= (value0 value1 value2 ..)
数组名= ([0]=value [1]=value [2]=value ...) //数组元素之间使用空格隔开
列表名="value0 value1 value2 ..." 数组名= ($列表名)
数组名[0]="value” 数组名[1]="value" 数组名[2]="value"
格式:${#数组名[@\*]} 实例: [root@localhost ~]# arr_ nymber=(1 2 3 4 5); [root@localhost ~]#arr_ length=${#arr_ number[*]} [root@localhost ~]# echo $arr length 5
格式:${数组名[下标]} 实例: [root@localhost ~]#arr_ index2=${arr_ number[2]} [root@localhost ~]# echo $arr_ index2 3
[root@localhost ~]# for v in ${arr_ number[@]} > do > echo $V > done 1 2 3 4 5
语法:sh [-nvx] 脚本名
经常使用选项:
-n:不执行脚本,仅检查语法。没有语法问题不显示任何内容,有问题提示报错。 -v:执行脚本时,先显示脚本内容,而后执行脚本。存在错误时,给出错误提示。 -x:将执行的脚本内容输出到屏幕上。
set -x:开启调节模式 set +x:关闭调节模式