21-Linux-shell脚本进阶篇(一)

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
    

跳至文章尾部

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值