文章目录
- [for 循环语句](#for 循环语句)
-
- [for 循环语法结构](#for 循环语法结构)
-
- 变量取值型
- [C 语言型](#C 语言型)
- [for 循环语句的基础实践](#for 循环语句的基础实践)
- shell脚本编写实例
for 循环语句
for 循环语法结构
变量取值型
第一种for循环语句语法结构如下:
bash
for 变量名 in 变量取值列表
do
指令...
done
在此结构中"in 变量取值列表"可以省略,省略时相当于in "$@",也就是使用 for i 就相当于使用for i in "$@"。
这种for循环语句执行过程如下:
- for关键字后面会有一个"变量名",变量名依次获取in关键字后面的变量取值列表内容(以空格分隔)。
- 每次仅取一个,然后进入循环(do和done之间的部分)执行循环内的所有指令,当执行到done时结束本次循环。
- 之后,"变量名"再继续获取变量列表里的下一个变量值,继续执行循环内的所有指令,当执行到done时结束返回。
- 以此类推,直到取完变量列表里的最后一个值并进入循环执行到done结束为止。
C 语言型
第二种for循环语句称为C 语言型for循环,语法结构如下:
bash
for ((expl;exp2;exp3))
do
指令...
done
此种循环语句和while循环语句类似,但语法结构比while循环更规范、工整。
这种for循环语句说明如下:
-
for关键字后的双括号内是三个表达式:
-
第一个是变量初始化(例如:i=0)
-
第二个为变量的范围(例如:i<100)
-
第三个为变量自增或自减(例如:i++)。
-
-
当第一个表达式的初始值符合第二个变量的范围时,就进入循环执行;条件不满足时就退出循环。
for 循环语句的基础实践
bash
mkdir pics
touch pics/snap-2025-{1..12}.jpg
ls pics/snap-2025-{1..12}.jpg -1
[root@server bin 10:06:20]# ls -1 pics/
snap-2025-10.jpg
snap-2025-11.jpg
snap-2025-12.jpg
snap-2025-1.jpg
snap-2025-2.jpg
snap-2025-3.jpg
snap-2025-4.jpg
snap-2025-5.jpg
snap-2025-6.jpg
snap-2025-7.jpg
snap-2025-8.jpg
snap-2025-9.jpg
使用for语句将照片名称中2025改为2026
for file in *
do
echo $file
done
${file//}
分析当前网络172.25.254.0/24网络中有哪些机器在线?
单台:
ping -c3 172.25.250.1 &>/dev/null
如何判断命令执行是否成功:
-
ping -c3 172.25.250.1 &>/dev/null
$? 查看退出状态码
-
ping -c3 172.25.250.1 | grep 抓取命令成功后的提示关键词
bash
for host in 10.1.8.{10..12}
do
ping -c1 -W2 $host &>/dev/null
result=$?
if ((result==0));then
echo $host is online
else
echo $host is offline
fi
done
shell脚本编写实例
要求在模版虚拟机中开发一个脚本sethost:
- 执行sethost 11,则设置改主机的主机名为ha1.cui.cloud,IP地址为10.1.8.11,网关为10.1.8.21 DNS为10.1.8.21
- 执行sethost 12,则设置改主机的主机名为ha2.cui.cloud,IP地址为10.1.8.12,网关为10.1.8.21 DNS为10.1.8.21
以此类推 - 执行sethost 21,则设置改主机的主机名为network1.cui.cloud,IP地址为10.1.8.21,网关为10.1.8.2 DNS为10.1.8.223.5.5.5
- 执行sethost 22,则设置改主机的主机名为network2.cui.cloud,IP地址为10.1.8.22,网关为10.1.8.2 DNS为10.1.8.223.5.5.5
以下六台服务器全部克隆与模版虚拟机
10.1.8.11 ha1.cui.cloud ha1
10.1.8.12 ha2.cui.cloud ha2
10.1.8.13 proxy1.cui.cloud proxy1
10.1.8.14 proxy2.cui.cloud proxy2
10.1.8.21 network1.cui.cloud network1
10.1.8.22 network2.cui.cloud network2
对于网络节点网关为10.1.8.2 DNS为223.5.5.5
对于其他节点网关为10.1.8.21 DNS为10.1.8.21
准备虚拟机和克隆虚拟机过程:
登录模版虚拟机,创建脚本文件
[root@centos7 ~ 16:19:05]# mkdir bin
[root@centos7 ~ 16:19:11]# cd bin
务必要微调sethost脚本中两个参数:DOMAIN、CON_NAME
bash
[root@centos7 bin 16:19:12]# vim sethost
#!/bin/bash
DOMAIN=cui.cloud
CON_NAME=ens32
ADDRESS=10.1.8.$1
GATEWAY=10.1.8.21
DNS=10.1.8.21
num=$1
if ((num>=11 && num<=14 || num== 21 || num ==22));then
case $1 in
1[12])
HOSTNAME=ha$[$1-10].$DOMAIN
;;
1[34])
HOSTNAME=proxy$[$1-12].$DOMAIN
;;
2[12])
HOSTNAME=network$[$1-20].$DOMAIN
GATEWAY=10.1.8.2
DNS=223.5.5.5
;;
esac
hostnamectl set-hostname $HOSTNAME
nmcli connection modify ${CON_NAME} ipv4.addresses $ADDRESS/24 ipv4.gateway $GATEWAY ipv4.dns $DNS
nmcli connection up ${CON_NAME} &>/dev/null
#查看
echo "Hostname: $(hostname)"
echo "IP4:"
nmcli device show ens32|grep ^IP4
else
echo "Usage: $0 11-14 | 21-22"
fi
[root@centos7 bin 16:19:32]# chmod +x sethost
- 在模板虚拟机本地console中执行sethost命令测试,
例如:
sethost 11
sethost 21
测试没有问题的情况下,在执行init 0关机。
-
打快照,快照名称为sethostname。
-
选中该快照,点击克隆,节省磁盘空间,选择链接克隆。
-
克隆完成后,启动这些虚拟机。
-
在克隆出来的虚拟机中执行脚本,设置主机名和网络信息。
以network2 为例
bashsethost 21开发脚本weihu,用户维护集群:
-
脚本用法
语法1: weihu cmd COMMAND,作用在集群中所有的机器上执行对应COMMAND命令
语法2: weihu copy source target,作用将本地source文件,推送到集群中所有的机器上。
例如: weihu copy /etc/fstab target:target
-
集群节点包括
10.1.8.11 ha1.cui.cloud ha1
10.1.8.12 ha2.cui.cloud ha2
10.1.8.13 proxy1.cui.cloud proxy1
10.1.8.14 proxy2.cui.cloud proxy2
10.1.8.21 network1.cui.cloud network1
10.1.8.22 network2.cui.cloud network2
维护脚本在ha1节点开发:
bash
1. 配置/etc/hosts
[root@ha1 ~ 16:37:35]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.8.11 ha1.cui.cloud ha1
10.1.8.12 ha2.cui.cloud ha2
10.1.8.13 proxy1.cui.cloud proxy1
10.1.8.14 proxy2.cui.cloud proxy2
10.1.8.21 network1.cui.cloud network1
10.1.8.22 network2.cui.cloud network2
2. 配免密登录
[root@ha1 ~ 16:38:12]# [ -d ~/.ssh ] || mkdir -m 700 ~/.ssh
[root@ha1 ~ 16:38:38]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
[root@ha1 ~ 16:39:21]# echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
[root@ha1 ~ 16:39:32]# for host in ha{1,2} proxy{1,2} network{1,2}
do
sshpass -p 123 ssh-copy-id root@$host &>/dev/null
ssh root@$host hostname
done
3. 开发维护脚本
[root@ha1 ~ 16:42:31]# cd bin/
[root@ha1 bin 16:42:33]# vim weihu
#!/bin/bash
function usage () {
echo "Usage: weihu cmd COMMAND, 在集群中所有的机器上执行对应COMMAND命令"
echo "Usage: weihu copy source target,将本地source文件,推送到集群中所有的机器上"
exit
}
action=$1
HOSTLIST='ha1 ha2 proxy1 proxy2 network1 network2'
(( $#<=1 )) && usage
case "$action" in
"cmd")
# 删除参数1
shift
COMMAND="$*"
for host in $HOSTLIST
do
ssh root@$host "$COMMAND"
done
;;
"copy")
# 删除参数1
shift
for host in $HOSTLIST
do
scp $1 root@$host:$2
done
;;
*)
usage
;;
esac
[root@ha1 bin 16:52:01]# chmod +x weihu
4. 验证
[root@ha1 ~ 17:04:56]# weihu cmd hostname
ha1.cui.cloud
ha2.cui.cloud
proxy1.cui.cloud
proxy2.cui.cloud
network1.cui.cloud
network2.cui.cloud
[root@ha1 ~ 17:04:59]# weihu copy /etc/hostname /tmp
hostname 100% 16 21.3KB/s 00:00
hostname 100% 16 12.5KB/s 00:00
hostname 100% 16 12.5KB/s 00:00
hostname 100% 16 13.3KB/s 00:00
hostname 100% 16 8.6KB/s 00:00
hostname 100% 16 12.2KB/s 00:00
[root@ha1 ~ 17:05:18]# weihu cmd cat /tmp/hostname
ha1.cui.cloud
ha1.cui.cloud
ha1.cui.cloud
ha1.cui.cloud
ha1.cui.cloud
ha1.cui.cloud