●读取不同的变量值,用来逐个执行同一组命令
●for循环:指定次数循环;遍历:把集合中的每个元素挨个读取一遍
结构一:遍历集合
for 变量名 in 取值列表
do
命令序列
done
结构二:指定次数
for ((i=1;i<=5;i++))
do
命令序列
done
实例1:
批量添加用户
用户名存放在user.txt文件中,每行一个
初始密码均设为123456
实例2:
根据IP地址检查主机状态
IP地址存放在ipadds.txt文件中,每行一个
使用ping命令检测各主机的连通性
使用以下符号需要先加let或者两个小括号((sum+=$i))
符号后面可以跟整数,也可以跟调用的变量
++ 自身变量加1 – 自身变量减1
+=5 自身变量加5 -=5 自身变量减5
*=5 自身变量乘5 /=5 自身变量除5
%=5 自身变量取余5
实例1:
在屏幕上输出1-10(三种方式)
实例3:
将1-100中的奇数进行求和(四种语法)
注意:sum=0必须放在循环语句的上面(放在do下面每次sum都是从0开始)
重复测试某个条件,只要条件成立则反复执行
注意:
if条件成立只执行一次,而while成立了会反复执行,直到不成立
for可以先定义一个集合,再通过临时变量进行遍历
实例1:
批量创建5个用户:
用户名以stu开头,按数字进行编号,即stu1、stu2……
初始密码均为123123
外层循环控制行;内层循环控制列
外层循环执行一次,内层循环执行一遍
打印一个直角三角形
echo -n ##不换行输出
echo -e ##支持加反斜线转义的字符(例如 \t 是水平制表符)
实例:
直角三角形
重复测试某个条件,只要条件不成立则反复执行;条件成立则退出循环
until 条件测试操作
do
命令序列
done
实例:
为指定用户发送在线消息
若用户不在线,则每6秒试一次,直至用户登录系统后再发送消息
用户名与消息通过位置参数传递给脚本
需求分析:
1.位置参数个数大于1;2.姓名是否属于系统用户
3.用户是否在线 until who 4.发送消息 echo “消息” | write 用户名
●将命令序列按格式写在一起
●可方便重复使用命令序列
●shell函数定义
[ function ] 函数名(){
命令序列
[return x] ##使用return或exit可以显式地结束函数
}
return:可以返回状态码或者数据(echo输出)
exit:只返回状态码
函数体外调用状态码或者值时:
return返回的是状态码,需要使用$?调用
echo 返回的是值,使用变量调用
传参:指位置变量
实例:
两个数字求和
通过sum(){ }定义函数
使用read命令交互输入两个数并求和
函数写好了要调用它才起作用!!
●调用函数的方法
函数名 [参数1] [参数2]
参数的表示方法:$ 1 $ 2 $ 3 ……$ {10} ${11}
●函数在shell脚本中仅在当前shell环境中有效
●shell脚本中变量默认全局有效
●将变量限定在函数内部使用local命令
一旦在函数内通过local来定义变量,只能在函数体内识别
示例:
函数内部变量通过local实现
local定义的函数体内的变量,可以通过函数体外先将函数赋值给一个变量,
再输出这个变量来引用local变量的值
●调用自己本身的函数
实例:
递归遍历目录/var/log
通过定义递归函数list_files来实现
第一次循环:
$1 /var/log
$2 一个空格
第二次循环:
$1=$1/ $m /var/log/anaconda
$2=一个空格+$2 即两个空格
数组:相同数据类型的集合 (例如整型、浮点型、字符串)
在内存中开辟了连续的空间
配合循环使用
举例:数组arr=(11 22 33 44)
数组名称:arr
数组元素:11,22,33,44
数组长度:4
数组下标:0 1 2 3(从0开始,例如33元素的下标值是2)
下面这种写法只支持调用数组中的所有元素,不支持单个元素
方法一:arr=(11 22 33 44)
方法二:arr=([0]=11 [1]=22 [2]=33 [3]=44)
方法三:list="11 22 33 44"
arr=($list)
方法四:arr[0]=11
arr[1]=22
arr[2]=33
方法四可用来替换掉数组中的某一个元素
数组包括的数据类型:
●数值类型
●字符类型
使用“”或‘’定义
需求:创建一个1-100的数组
需求:创建一个存放(1-100)中奇数的数组
3.4常见数组操作
●获取数组长度:
${#数组名[*]}
●读取某下标赋值:
${数组名[下标]}
●数组遍历:
for v in ${arr[@]}
do
echo "$v"
done
需求2:将数组内的数字从小到大排序
使用冒泡排序
首先得了解a和b两个变量如何对调变量值:
a=10
b=20
方法(借助一个容器):
tmp=$ a
a=$ b
b=$tmp
●数组切片
${数组名[@]:起始位置:长度} 中间冒号隔开!!
●数组的替换 重点!!替换元素后再赋值给自己
${数组名[*]/查找字符/替换字符}
●数组删除
unset
●echo命令 ##常用
●bash命令
命令语法
sh [-nvx] 脚本名
●set命令
set -x:开启调节模式
set +x:关闭调节模式
检测结果如下,可以看到脚本执行的详细过程
[root@localhost ~]# sh -vx 60.sh
#!/bin/bash
arr=(45 85 65 25 78 52)
+ arr=(45 85 65 25 78 52)
i=0
+ i=0
set -x
+ set -x
for v in ${arr[*]}
do
if [ $v -lt 60 ];then
unset arr[$i]
fi
let i++
done
+ for v in '${arr[*]}'
+ '[' 45 -lt 60 ']'
+ unset 'arr[0]'
+ let i++
+ for v in '${arr[*]}'
+ '[' 85 -lt 60 ']'
+ let i++
+ for v in '${arr[*]}'
+ '[' 65 -lt 60 ']'
+ let i++
+ for v in '${arr[*]}'
+ '[' 25 -lt 60 ']'
+ unset 'arr[3]'
+ let i++
+ for v in '${arr[*]}'
+ '[' 78 -lt 60 ']'
+ let i++
+ for v in '${arr[*]}'
+ '[' 52 -lt 60 ']'
+ unset 'arr[5]'
+ let i++
set +x
+ set +x
echo ${arr[@]}
85 65 78