shell脚本进阶篇(一)
seq的简略用法
-
seq命令用于产生从某个数到另外一个数之间的所有整数。
-
例如:列出1到7的数字
[root@CentOS7 data]# seq 7 |tr '\n' ' ' 1 2 3 4 5 6 7
-
seq同样支持管道传输
选项 :
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
示例 :
-
列出1到10间隔为2的数字
[root@CentOS7 data]# seq 1 2 10 |tr '\n' ' ' 1 3 5 7 9
-
列出99到101的数字,并同宽显示
[root@CentOS7 data]# seq -w 99 101 099 100 101
-
列出99到105间隔为2的数字,并添加-f选项
[root@CentOS7 data]# seq 99 2 105 99 101 103 105 [root@CentOS7 data]# seq -f"%3g" 99 2 105 99 101 103 105
-f :格式替代符
%b 相对应的参数被视为含有要被处理的转义序列之字符串。
%c ASCII字符。显示相对应参数的第一个字符
%d, %i 十进制整数
%e, %E, %f 浮点格式
%g %e或%f转换,看哪一个较短,则删除结尾的零
%G %E或%f转换,看哪一个较短,则删除结尾的零
%o 不带正负号的八进制值
%s 字符串
%u 不带正负号的十进制值
%x 不带正负号的十六进制值,使用a至f表示10至15
%X 不带正负号的十六进制值,使用A至F表示10至15
%% 字面意义的%
-
seq无法逆向显示数字
-
例如:显示10到3的数字
[root@CentOS7 data]# seq 10 3 [root@CentOS7 data]#
-
例如:显示10到3间隔为2的数字
[root@CentOS7 data]# seq 10 2 3 [root@CentOS7 data]#
for简略用法
-
格式 :
for 变量名 in 列表;do 循环体 done
示例 :
-
将一列数字的值 赋给变量 i
[root@CentOS7 data]# for i in 1 2 3;do echo number=$i;done number=1 number=2 number=3
-
当赋给变量 i值 数量过多时,可使用花括号{ }
[root@CentOS7 data]# for i in {1..5};do echo number=$i;done number=1 number=2 number=3 number=4 number=5
-
将1到6间隔为2的数字的值赋给变量 i
[root@CentOS7 data]# for i in {1..6..2};do echo number=$i;done number=1 number=3 number=5
-
应注意花括号{ }的边界不能出现空格,该格式表示为空格前后是两个不同的赋给变量i 的值,无法识别花括号{ }扩展
[root@CentOS7 data]# for i in {1..6..2 };do echo number=$i;done number={1..6..2 number=}
-
for也支持循环递减
-
例如:将10到5间隔为2的数字的值赋给变量 i
[root@CentOS7 data]# for i in {10..5..-2};do echo number=$i;done number=10 number=8 number=6
for与seq的循环简略组合用法
-
使用seq将1到9间隔为3的数字的值赋给变量 i
[root@CentOS7 data]# for i in `seq 1 3 9`;do echo number=$i;done number=1 number=4 number=7
-
利用for我们还可以实现类似grep的搜索功能
-
例如: 将/etc/下所有以 .d 结尾的文件名赋给变量 i,以此达到搜寻该目录下所有以.d结尾的文件。数量过多仅做部分展示
[root@CentOS7 data]# for id in /etc/*.d;do echo $id;done /etc/auto.master.d /etc/init.d ................. /etc/rc3.d /etc/yum.repos.d
-
当我们需要修改大量文件名的时候,手动修改是非常效率低下的。因此
-
使用for便可以实现自动、快速、批量的修改文件名
[root@CentOS7 scripts]# ls f1.txt f2.txt f3.txt f4.log f5.log f6.log f7.png f8.png f9.png [root@CentOS7 scripts]# vim rename_file.sh #!/bin/bash for file in /data/scripts/*;do # 将该目录下所有文件名作为赋值给变量file的参数 file_headname=`echo $file |sed -nr 's#(.*)\..*$#\1#p'` # 设置环境变量,取出文件名的头部(.之前的部分) mv $file ${file_headname}.apk # 将原文件名修改,头部不变,后缀改为 .apk echo $file is rename ${file_headname}.apk # 打印至终端,告知用户该文件已被修改 done # 结束
[root@CentOS7 scripts]# chmod +x rename_file.sh #给脚本添加执行权限
[root@CentOS7 scripts]# mv rename_file.sh ../ #由于脚本与文件在同一目录下,所以需要移走
[root@CentOS7 scripts]# cd .. #进入上级目录
[root@CentOS7 data]# ./rename_file.sh #执行脚本
/data/scripts/f1.txt is rename /data/scripts/f1.apk
/data/scripts/f2.txt is rename /data/scripts/f2.apk
.................................
/data/scripts/f8.png is rename /data/scripts/f8.apk
/data/scripts/f9.png is rename /data/scripts/f9.apk
[root@CentOS7 data]# ls scripts/ 查看核实结果
f1.apk f2.apk f3.apk f4.apk f5.apk f6.apk f7.apk f8.apk f9.apk
- 利用for还可以做什么呢?
利用for批量创建用户
编辑一个要创建的用户列表的文件
[root@CentOS7 data]# vim name.txt
zhanglang
mayun
zhaoritian
mahuateng
[root@CentOS7 data]# vim batch_user.sh
#!/bin/bash
for USER in `cat /data/name.txt`;do # 将该目录下的每行字符作为赋值给变量 USER的参数
if id $USER &> /dev/null;then # 判断赋值的参数是否为已存在的用户
echo "$USER is exist.";exit # 若已存在该用户,则打印至终端,告知用户
else # 反之
useradd $USER # 创建该用户
echo $USER | passwd --stdin $USER &> /dev/null # 将该用户名作为该用户的登录密钥,且登录后立即过期必须修改密钥
echo "$USER is created." # 打印至终端,告知用户该用户已创建成功
fi
done
[root@CentOS7 data]# vim batch_user.sh
[root@CentOS7 data]# chmod +x batch_user.sh
[root@CentOS7 data]# ./batch_user.sh
zhanglang is created.
mayun is created.
zhaoritian is created.
mahuateng is created.
[root@CentOS7 data]# cat /etc/passwd
..............................
zhanglang:x:1002:1002::/home/zhanglang:/bin/bash
mayun:x:1003:1003::/home/mayun:/bin/bash
zhaoritian:x:1004:1004::/home/zhaoritian:/bin/bash
mahuateng:x:1005:1005::/home/mahuateng:/bin/bash
-
另外,for还有特殊格式((…)),实现C语言风格的变量操作
-
累加1至100的和
[root@CentOS7 data]# vim 1_100.sh #!/bin/bash sum=0 for ((i=1;i<=100;i++));do let sum+=i done echo sum=$sum [root@CentOS7 data]# chmod +x 1_100.sh [root@CentOS7 data]# ./1_100.sh sum=5050 [root@CentOS7 data]#
-
打印一串随机数,显示其中最大值与最小值
[root@CentOS7 data]# vim max_min.sh #!/bin/bash for ((i=0;i<10;i++));do N=$RANDOM echo -e "$N \c" if [ $i -eq 0 ];then MAX=$N MIN=$N else [ $N -gt $MAX ] && MAX=$N [ $N -lt $MIN ] && MIN=$N # if [ $N -gt $MAX ];then # MAX=$N # fi # if [ $N -lt $MIN ];then # MIN=$N # fi fi done echo echo echo MAX=$MAX echo echo MIN=$MIN [root@CentOS7 data]# chmod +x max_min.sh [root@CentOS7 data]# ./max_min.sh 4963 19191 14443 11564 9807 9680 1872 16925 7612 10735 MAX=19191 MIN=1872