Linux系统shell脚本(四)
循环控制语句continue
ontinue[N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
for (());do循环体1...if command2;thencontinuefiCMDn....
done
示例:循环到5跳过5,输出1-10
[root@www ~]# vim continue.sh
#!/bin/bashi=0
while [ $i -le 9 ]
dolet i++if [ $i -eq 5 ]thencontinuefiecho $idone[root@www ~]# ./continue.sh
1
2
3
4
6
7
8
9
10
循环控制语句break
break[N]:提前结束第N层后的全部循环;最内层为第1层,默认为1
示例:结束内层循环
#!/bin/bash
for((i=0;i<10;i++));dofor((j=0;j<10;j++));do[ $j -eq 5 ] && breakecho $j doneecho ----------------------------done
[root@ansible-salve1 shell]# vim info14.sh
[root@ansible-salve1 shell]# bash info14.sh
0
1
2
3
4
----------------------------
0
1
2
3
4
----------------------------
示例:结束外层循环
#!/bin/bash
for((i=0;i<10;i++));dofor((j=0;j<10;j++));do[ $j -eq 5 ] && break 2·echo $j doneecho ----------------------------done
[root@ansible-salve1 shell]# vim info14.sh
[root@ansible-salve1 shell]# bash info14.sh
0
1
2
3
4
[root@ansible-salve1 shell]#
shift技术
shift命令用于对参数的向左移动,通常用于在不知道传入参数个数的情况下依次遍历每个参数,然后进行相应的处理(常见与Linux中各种程序的启动脚本)。在扫描处理脚本程序的参数时,经常要用到shift命令
shift命令每执行一次,参数序列顺次左移一个位置,$#
的值减1,用于分别处理每个参数,移出去的参数不可再用
注意:$#
表示脚本后跟随的参数总的个数,$n可以获取脚本后跟随的第n个参数的值
示例
#!/bin/bashwhile [ $# -ne 0 ]
doecho "一共有$#个参数内容分别是:"for i in `seq $#` ;doecho -n "$i"doneecho shift
done
[root@www ~]# ./shift.sh 1 2
一共有2个参数内容分别是:
12
一共有1个参数内容分别是:
1
使用不同shift技术产看不同服务运行状态
#!/bin/bash
#
while [ $# -ne 0 ]
dosystemctl status $1shiftecho ”----------“
done
~
Shell中的数组
1、Shell数组的概念
数组是若干数据的集合,其中存放的每一份数据都称为元素。Shell
不限制数组的大小,理论上可以存放无限量的数据,Shell
数组元素的下标也是从0开始计数
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;下标必须大于等于0
2 Shell数组的定义
2.1 数组的基本定义
在Shell
中,用小括号()
来表示数组,数组元素之间用空格来分隔
#arrayname=(1 2 3 4 5)
`输出定义数组中的全部元素
#echo ${arrayname[*]}
#echo ${arrayname[@]}
`输出定义数组中的第二个元素
#echo ${arrayname[0]}
`输出定义数组中的第二个元素
#echo ${arrayname[1]}
`输出定义数组中的元素个数
#echo ${#arrayname[*]}
2.2 采用键值对的形式赋值
在Shell
中用小括号将变量括起来,同时采用键值对的形式赋值
#array2=([1]=one [2]=two [3]=three)
echo ${array2[*]} #输出定义数组的所有元素
echo ${array2[@]} #输出定义数组的所有元素
echo ${#array2[@]} #输出定义数组的元素个数
2.3 通过分别定义数组变量的方法来定义
#array3[1]=a
#array3[2]=b
#array3[3]=c
`输出定义数组中的全部元素
echo ${array3[@]}
`输出定义数组中的第一个元素
echo ${array3[1]}
2.4 动态定义数组数量
# mkdir -p /array
# touch /array/{1..5}.txt
# ls /array
# array4=($(ls /array))
# echo ${array4[*]}
# echo ${array4[@]}
# echo ${#array4[*]}
3 Shell数组的打印
打印单个数组元素: ${数组名[下标]} 。当未指定数组下标时,下标默认从0开始
打印全部数组内容:${数组名[@]}或 ${数组名[*]}
打印数组元素的个数:${#数组名[@]}或 ${#数组名[*]}
4 Shell数组的赋值
如果下标不存在,则自动添加一个新的元素;如果下标存在,则覆盖原来的值
5 Shell数组的拼接合并
所谓Shell
数组拼接(数组合并),就是将两个数组连接成一个数组
拼接数组的思路是:先利用@
或者*
,将数组扩展成列表,然后再合并到一起,具体格式如下:
array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
`两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。
6 Shell删除数组元素
在Shell
中,使用unset关键字来删除数组元素,具体格式如下
unset array_name[index]
`其中,array_name表示数组名,index表示数组下标unset array_name
`删除整个数组
7 数组元素的替换
${数组名[@/*]/查找字符/替换字符}
该操作不会改变原先数组内容,如果需要修改,使用覆盖
#!/bin/bash
array=(yoona lucy tom)
echo ${array[@]/lucy/lily}
echo ${array[*]}--->结果为:
yoona lily tom
yoona lucy tom
8 关联数组
ash支持关联数组,它可以使用字符串作为数组索引,有时候采用字符串索引更容易理解
8.1 定义关联数组
首先需要使用声明语句declare
将一个变量声明为关联数组
# declare -A assArray
声明后,可以有两种方法将添加到关联数组中
1.利用内嵌索引-值列表的方法
# assArray=([lucy]=beijing [yoona]=shanghai) # echo ${assArray[lucy]} --->结果为: beijing
2.使用独立的索引-值进行赋值
# assArray[lily]=shandong # assArray[sunny]=xian # echo ${assArray[sunny]} -->结果为:xian
8.2 列出数组索引
每一个数组都有一个索引用于查找。使用${!数组名[@/*]}
获取数组的索引列表
# echo ${!assArray[*]}
# echo ${!assArray[@]}
#! /bin/bash
declare -A cityArray
cityArray=([yoona]=beijing [lucy]=shanghai [lily]=shandong)
for key in ${!cityArray[*]}
doecho "${key} come from ${cityArray[$key]}"
done--->结果为:
lily come from shandong
yoona come from beijing
lucy come from shanghai
9 mapfile命令
可交互式创建数组
Shell中的函数
1 Shell函数的定义
Shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编好了,放在了指定位置,使用时直接调用即可
Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。
Shell 函数定义的语法格式如下:
function name() {statements[return value]
}
对各个部分的说明:
function
是 Shell 中的关键字,专门用来定义函数;name
是函数名;statements
是函数要执行的代码,也就是一组语句;return value
表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
由{ }
包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。
函数定义的简化写法
1.
name() {statements[return value]
}
2.
function name() {statements[return value]
}
2 Shell函数的调用
调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
name
如果传递参数,那么多个参数之间以空格分隔:
name param1 param2 param3
不管是哪种形式,函数名字后面都不需要带括号。
和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
3 Shell函数详解
Shell中的函数在定义时不能指明参数,但是在调用时却可以传递参数。函数参数是Shell位置参数的一种,在函数内部可以使用$n
来接收,例如:$1
表示第一个参数,$2
表示第二个参数,依次类推
除了$n
,还有另外三个比较重要的变量:
$#
可以获取传递的参数的个数;$@
或者$*
可以一次性获取所有的参数
nginx启停脚本案例
#!/bin/bash
start(){
#当封装函数时,不能使用ps命令netstat -anptu | grep nginx &> /dev/nullif [ $? -eq 0 ] thenecho "服务已经启动"elsenginxecho "nignx服务正在启动...OK!"fi
}
stop(){netstat -anptu | grep nginx &> /dev/nullif [ $? -ne 0 ]thenecho "nginx服务已经关闭"elseecho $?nginx -s stopecho "nignx服务正在关闭...OK!"fi
}
reload(){nginx -s reloadecho "nignx服务正在重载...OK!"
}
restart(){nginx -s stop &> /dev/nullnginxecho "nignx服务正在重启...OK!"
}case $1 in
start)start
;;
stop)stop
;;
reload)reload
;;
restart)restart
;;
*)echo "USEAGE: $0 start | stop | reload | restart"
esac