循环
for循环语句
格式
for 变量名 in 取值列表
do
命令序列
done
for i in kc01 kc02 kc03 kc04 kc05
do
echo " hello $i"
done
for i in $(seq 1 5)
do
echo " hello $i"
done
while语句结构
重复测试某个条件,只要条件成立则反复执行
结构
while 条件测试操作
do
命令序列
done
#免交互式设置密码
echo "123" | passwd --stdin $username
循环控制
break:满足条件退出
continue:满足条件退出一次循环
untill
重复测试某个条件,只要条件不成立则反复执行
https://blog.csdn.net/qq_33906471/article/details/139678190?spm=1001.2014.3001.5502
函数
后台执行,与并发
{
ping -c 1 -w 1 192.168.27.$i &> /dev/null
if [ $? -eq 0 ]
then
echo "192.168.27.$i 存活"
else
echo "不存活"
fi
done
#这段代码会在后台执行
} &
#并发,等待一个或多个在后台运行的进程,并返回其终止状态
wait
~
详细操作https://blog.csdn.net/qq_33906471/article/details/139740050?spm=1001.2014.3001.5502
$$的作用:每次这个脚本被调用时,它都会生成一个包含当前进程ID的日志文件名,如 `script_log_12345.txt`(其中 `12345` 是脚本的进程ID)。这样,即使多个用户或进程同时运行这个脚本,每个实例都会将日志写入一个不同的文件。
将命令序列按格式写在一起
可方便重复使用命令序列
shell函数定义
[function] 函数名(){
命令序列
[return x]
}
调用函数
函数名 [参数1] [参数2]
[root@bogon ~]# cat test02.sh
#!/in/bash
function hello(){
echo "这是一个函数"
}
hanshu() {
echo "这是第二个函数"
}
hello
hanshu
终止函数(后面常常跟一个0~255的数,代表状态码)
return
exit
传参
check_cmd() {
$1
if [ "$?" -eq 0 ];then
echo "$1,命令执行成功"
return 1
else
#接收参数也是用$1
echo "$2,命令执行失败"
fi
}
#传入参数
check_cmd "yum clean all"
check_cmd "ls"
command -v 命令:效验命令是否执行成功
canshu(){
cmd=$1
if ! command -v $cmd &> /etc/null;then
echo "执行成功"
else
echo "命令不存在 "
return 2
fi
}
canshu "yum allaaaaaaaaaa"
函数的作用和范围
作用
代码复用:函数允许你将一段代码定义为一个独立的单元,然后在需要的地方多次调用它。这避免了代码的重复,提高了代码的可维护性和可读性。
模块化:通过将代码分解为多个函数,你可以更容易地将程序划分为逻辑上独立的模块。这有助于管理和理解大型程序。
抽象化:函数隐藏了实现的细节,只展示了需要给外部使用的接口。这使得你可以在不改变其他代码的情况下修改函数的内部实现。
提高可读性:当函数被命名为描述其功能的名称时,它们可以使代码更加易于理解。阅读者只需查看函数名即可了解该段代码的大致作用。
易于调试:由于函数是独立的代码块,因此当出现问题时,你可以更容易地定位到问题的根源。此外,你也可以更容易地为函数编写单元测试。
范围
局部范围:函数内部的变量(局部变量)通常只能在函数内部访问。这意味着在函数外部不能直接访问这些变量。这是封装和抽象化的一个关键部分。
local 声明的变量为局部变量
全局范围:在函数外部定义的变量(全局变量)可以在整个程序中访问。然而,过度使用全局变量可能会导致代码难以理解和维护,因为它们可以被任何函数修改。
数组
应用场景
获取数组长度
获取元素
遍历数组
获取元素长度
切片
格式
数组名=(元素1 元素2 元素3)
获取数组
${数组名[i]}
${#kgc[@]}
切皮获取
${数组名[@]:起始下标:切皮长度}
替换
${数组名[@]/被替换的元素/替换元素}
删除
unset kgc[要删除的元素下标]