shell_for笔记

1.交互输入

read【交互式界面】

  :read a b c

   aa bb cc

  read命令同时可以定义多个变量;而输入的内容默认以空格为分隔符,将值输入到对应的变量中;如果默认值过多,最后所有的值都会被赋予给最后一个变量;如果默认值过少,多余的变量则为空值

  read如何输入:

        echo”请输入一个目录:”         //我们需要 echo -n取消换行符号

        例:echo”请输入一个目录:”;read变量

          请输入一个目录:/etc

常用参数:

      -p   read -p ”请输入一个目录:”变量

扫描二维码关注公众号,回复: 7032223 查看本文章

      -t   定义超时时间 read -t 5 -p ”请输入一个目录:”变量

脚本默认值

   输入内容-------------------------------

   |                                                    |

   输入是否正确-----                    没有输入------------

    |                 |                               |                         |

  正确      不正确,给提示      提示必须输入  给出默认值

  [ ! -n $filename ]

练习:输入一个设备文件,输出这个设备文件的基本信息

 1 #!/bin/bash
 2 
 3 #
 4 
 5 read -t 5 -p “输入一个设备文件名:”devname
 6 
 7 [ -z $devname ]&& devname=`fdisk -l`&& exit 1
 8 
 9  
10 
11 if [ -b /dev/$devname ];then   #-b 是否为块文件
12 
13    fdisk -l /dev/$devname 
14 
15    exit 0
16 
17 else
18 
19    echo “$devname不是设备文件”
20 
21    echo “Usage:‘请输入一个设备文件,如:sda’”
22 
23    exit 2
24 
25 fi

2.for语句循环

case语句

   case语句的语法格式:

  case 变量 in

  patten1)

    代码块1

    ;;

  patten2)

          代码块2

          ;;

       *)

      esac

for语句的应用场景:

   有一个功能,这个功能需要循环执行,只是执行对象不同;【对象必须是同类数据】

for语句格式:

  a=[‘a’,’b’,’c’] –在python程序中,我们很多情况下,需要调用相应的方法去生成列表;

  for 变量 in 列表;do

    循环体

  done

练习:99乘法表

 1 #!/bin/bash
 2 
 3 for I in`seq 9`;do
 4 
 5    for j in `seq 9`;do
 6 
 7       [$j -le $i] && echo -n -e “$i*$j=`echo $(($i*$j))`\t”
 8 
 9    done
10 
11    echo “ ”
12 
13 done
 1 #!/bin/bash
 2 
 3 #九九乘法表
 4 
 5 for i in {1..9};do
 6 
 7    for j in $i;do
 8 
 9       echo -n -e“$j*$i=$[$i*$j]\t”
10 
11    done 
12 
13    echo
14 
15 done

echo -e

  -e 使echo命令,能够识别特殊符号

   \r 回车不换行

   \n 换行符

   \t 制表符tab=4个空格

  unix2dos \r\n  à \n

  dos2unix

列表生成方式:

1. 直接给出字符串列表

  for i in a b c d e;do

     循环体

  done

2. 整数列表

  a{start…end} //{1..1}是不行的{1..9}==python中的range

  b seq命令引用 $(seq[start[step]]end)

            步长 python range{1,100,2}

            seq 20 30

题目:用for循环实现遍历本网络段中左右up的主机

 1 declare -I sum=0
 2 
 3 for i in $(seq 1 254);do
 4 
 5    ping -c 1 -w 1 10.6.12.$i &> /dev/null
 6 
 7    if [ $? -eq 0 ];then
 8 
 9  let sum++
10 
11  echo10.6.12.$i是通的”
12 
13         else
14 
15             echo10.6.12.$i是不通的”
16 
17          fi
18 
19 done
20 
21 echo “总共有$sum台电脑在线”

3. 返回列表的命令

  $(COMMAND)

  应用场景:ls /var/log/

题目:判断/var/log/的所有文件。以.log结尾的文件统计处理,并显示:

 1  #!/bin/bash
 2 
 3    #
 4 
 5    declare -i sum=0
 6 
 7    for i in $(ls /var/log/);do
 8 
 9 if[“*.log”=$i];then
10 
11          echo $i
12 
13          let sum ++
14 
15 fi
16 
17         done
18 
19         echo “.log结尾的文件有:$sum

4. glob机制—文件名通配符的机制

  $(ls /var/log/)

  /var/log/*

test命令总结:

1.test的命令的option的 -a -o只能在命令中使用

  例如【`du -h $filename|cut -d: -f1` -lt 100k -a -x $filename】

  test `du -h $filename |cut -d: -f1` -lt 100k -a -x $filename

  注意:做字符串匹配的时候,不支持正则以及通配符

2.test test==[[]]

  再连接两个test的命令的时候,不能使用命令内部option -o -a

  一般使用|| && == != >= <=

  例如:[[yum.log==*.log]]

5.变量引用

  $@ $* 将参数做为for循环的列表

  $0 –和awk不一样

   bash中$0代表运行的脚本文件

   【awk按行执行】awk中$0整行内容

  需要用多个词的时候用“$@”,需要一个词的时候用“$*”

猜你喜欢

转载自www.cnblogs.com/TheNeverLemon/p/11359390.html