描述:在 system1 上创建一个脚本,名为 /root/mkusers , 此脚本能实现为系统 system1 创建本地用户, 并且这些用户的用户名来自一个包含用户名列表的文件。同时满足下列要求:
此脚本要求提供一个参数,此参数就是包含用户名列表的文件
如果没有提供参数,此脚本应该给出下面的提示信息 Usage: /root/mkusers userfile 然后退出并返回相应的值
如果提供一个不存在的文件名,此脚本应该给出下面的提示信息 Input file not found 然后退出并返回相应的值
创建的用户登录shell为 /bin/false
此脚本不需要为用户设置密码
[root@server0 ~]# wget http://rhgls.domain1.example.com/materials/userlist [root@server0 ~]# cat userlist clearlove Uzi jack Faker [root@server0 ~]# vim /root/mksuers #!/bin/bash if [ $# -eq 0 ];then echo "Usage:/root/mkusers userfile" exit 1 fi if [ ! -f $1 ];then echo "Input file not found" exit 1 fi while read line do useradd -s /bin/false $line done < $1 [root@server0 ~]# chmod +x /root/mksuers [root@server0 ~]# sh /root/mksuers Usage:/root/mkusers userfile [root@server0 ~]# sh /root/mksuers mmm Input file not found [root@server0 ~]# sh /root/mksuers userlist [root@server0 ~]# id Uzi uid=1007(Uzi) gid=1007(Uzi) groups=1007(Uzi) [root@server0 ~]# id Faker uid=1009(Faker) gid=1009(Faker) groups=1009(Faker) [root@server0 ~]# id clearlove uid=1006(clearlove) gid=1006(clearlove) groups=1006(clearlove)
while read ilne练习
#### 题目要求
计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字。例如a.txt内容如下:
12aa*lkjskdj
alskdflkskdjflkjj
我们脚本名字为 ncount.sh, 运行它时:
bash ncount.sh a.txt
输出结果应该为:
2
0
sum:2
#### 参考答案
```
|
当我们输入的字段比变量数目多时,最后一个变量的值将不只一个字段,而是所有剩余的内容;当输入字段比变量数少时,多余的变量将是空值,你可以自己试试。现在我们再来看
while read line
do
…
done < file
read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。还记得while根据其后的命令退出状态来判断是否执行循环体吗?是的,read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续进行;当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出。
另一种也很常见的用法:
command | while read line
do
…
done
如果你还记得管道的用法,这个结构应该不难理解吧。command命令的输出作为read循环的输入,这种结构长用于处理超过一行的输出,当然awk也很擅长做这种事。