一、专题背景
最近使用了个自动化平台(详见自动化运维平台Spug测试)进行每周的变更,效果很不错,平台将大量重复繁琐的操作通过脚本分发方式标准化自动化了,平台核心是下发到各个服务器的shell脚本,感觉有必要对shell脚本做个总结,所以有了写本专题的想法。本专题将结合运维实际介绍shell脚本的各项用法,预计10篇左右,将包括系统巡检、监控、ftp上传下载、数据库查询、日志清理、时钟同步、定时任务等,里面会涉及shell常用语法、注意事项、调试排错等。
二、本文前言
本文是该专题的第四篇。
循环是编程的一部分,shell脚本的编写离不开循环。文章主要介绍了通过两层for循环查找可执行文件和使用while循环创建用户这两个示例。
三、脚本测试
1.查找可执行文件
本文示例展示了如何通过两层循环查找可执行文件。脚本如下:
[root@shell ~]# more find_exe.sh
#!/bin/bash
#查找用户环境变量中的可执行文件
IFS=:
for folder in $PATH
do
echo "$folder:"
for file in $folder/*
do
if [ -x $file ]
then
echo " $file"
fi
done
done
[root@shell ~]# ./find_exe.sh |more
/usr/local/sbin:
/usr/local/bin:
/usr/local/bin/chardetect
/usr/local/bin/docker-compose
/usr/local/bin/jsonschema
/usr/local/bin/__pycache__
/usr/local/bin/wsdump.py
/usr/sbin:
/usr/sbin/accessdb
/usr/sbin/addgnupghome
/usr/sbin/addpart
/usr/sbin/adduser
/usr/sbin/agetty
/usr/sbin/alternatives
/usr/sbin/anacron
/usr/sbin/applygnupgdefaults
运行时使用more命令分页,不然输出的命令太多会刷屏
- '#!/bin/bash':脚本首行,声明执行脚本的shell
- 'IFS=:':自定义分隔符为:
- 'for folder in $PATH':开启外层循环,使用for命令循环读取变量$PATH并赋值给folder
- 'for file in $folder/*':内层循环,将$folder/路径下循环找到的文件赋值给file
- 'if [ -x $file ]':判断file是否为可执行文件,是则通过echo输出
- 'done':结束循环,和do匹配
2.批量新增用户
本示例展示了如何用循环方式创建用户
[root@shell ~]# more useradd.sh
#!/bin/bash
# 批量新增用户
input="users.txt"
while IFS=','';' read username tips shell
do
echo "adding $username"
useradd -c "$tips" -m -s $shell $username
done < "$input"
[root@shell ~]#
[root@shell ~]# more users.txt
si,li si;/bin/bash
san,zhang san;/bin/bash
wu,wang wu;/bin/bash
[root@shell ~]#
[root@shell ~]# ./useradd.sh
adding si
adding san
adding wu
- users.txt为用户列表,包含用户名,用户备注和用户登录的shell环境;
- users.txt为变量input的值作为 while 命令的重定向数据,即通过read命令读取users.txt并通过自定义IFS区分出username、tips和登录的shell。
- IFS为内部字段分隔符,默认将空格、制表符和换行符当做分隔符,这里更改为','和';'。
四、本文总结
本文通过两个循环示例:查找可执行文件和批量新增用户,介绍了for循环和while循环的基本使用。同时也对read、IFS、冲入重定向做了说明。循环是shell编程的重要内容,学好循环可以为今后的学习打下牢固的基础。
本文所有脚本和安装包文件已上传github:shell-scripts-04
更多请点击:shell专题