for 循环语句
允许脚本一次性读取多个信息,然后逐一对信息进行操作处理。当要处理的数据有范围时,使用for循环语句。
使用 for 循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设 置密码。首先创建用户名称的列表文件users.txt,每个用户名称单独一行。
[root@localhost ~]# cat users.txt
marry
xiaoming
xiaohong
trick1
trick2
trick3
trick4
trick5
trick6
trick7
在脚本中使用 read 命令读取用户输入的密码值,然 后赋值给PASSWD变量,
并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容 即将作为账户密码。
在执行该脚本后,会自动使用从列表文件 users.txt 中获取到所有的用户 名称,
然后逐一使用“id用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成 功,也就是判断该用户是否已经存在。
在输入为账户设定的密码后将由脚本自动检查 并创建这些账户。
由于已经将多余的信息通过输出重定向符转移到了/dev/null黑洞文件中,
因此 在正常情况下屏幕窗口除了“用户账户创建成功”(Create success)的提示后不会有其他内容
[root@localhost ~]# cat addusers.sh
#!/bin/bash
read -p "输入你的密码:" PASSWD
for UNAME in `cat users.txt`
doid $UNAME &> /dev/nullif [ $? -eq 0 ]thenecho "$UNAME , ALready exists"elseuseradd $UNAME &> /dev/nullecho "$PASSWD" | passwd --stdin &> /dev/nullecho "$UNAME , create success"fi
done
[root@localhost ~]# bash addusers.sh
输入你的密码:123456
marry , create success
xiaoming , create success
xiaohong , create success
trick1 , create success
trick2 , create success
trick3 , create success
trick4 , create success
trick5 , create success
trick6 , create success
trick7 , create success
/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删 除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。
创建成功
[root@localhost ~]# tail -10 /etc/passwd
marry:x:1001:1001::/home/marry:/bin/bash
xiaoming:x:1002:1002::/home/xiaoming:/bin/bash
xiaohong:x:1003:1003::/home/xiaohong:/bin/bash
trick1:x:1004:1004::/home/trick1:/bin/bash
trick2:x:1005:1005::/home/trick2:/bin/bash
trick3:x:1006:1006::/home/trick3:/bin/bash
trick4:x:1007:1007::/home/trick4:/bin/bash
trick5:x:1008:1008::/home/trick5:/bin/bash
trick6:x:1009:1009::/home/trick6:/bin/bash
trick7:x:1010:1010::/home/trick7:/bin/bash
for语句和if结合
测试主机是否在线
准备主机列表文件
[root@localhost ~]# cat ip.txt
192.168.10.1
192.168.20.1
[root@localhost ~]# cat checkhosts.sh
#!/bin/bash
HLIST=$(cat ~/ip.txt)
for IP in $HLIST
doping -c 3 -i 0.2 -w 3 $IP &> /dev/nullif [ $? -eq 0 ]thenecho "Host $IP is On-line"elseecho "Host $IP is Off-line"fi
done
[root@localhost ~]# bash checkhosts.sh
Host 192.168.10.1 is Off-line
Host 192.168.20.1 is On-line
将前面的双分支if条件语句与for循环语句相结合,让脚本从主机列表文件 ip.txt中自动读取IP地址(用来表示主机)并将其赋值给HLIST变量,从而通过判断ping 命令执行后的返回值来逐个测试主机是否在线。
脚本中出现的“$(命令)”是一种完全类似于转义字符中反引号`命令`的Shell操作符,效果同样是执行括号或双引号括起来的 字符串中的命令。
Shell脚本中的代码缩进格式会根据不同的语句而改变。这是由 Vim编辑器自动完成的,用户无须进行额外操作