一、专题背景

最近使用了个自动化平台(详见自动化运维平台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命令分页,不然输出的命令太多会刷屏

image-20210303143913588

  • '#!/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

image-20210302171117272

  • 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专题