shell笔记_read与for语句循环

交互输入与for语句

 

1、交互输入

       read    Python中用input()函数,进行输入;

       read命令同时可以定义多个变量值;而输入的内容默认以空格为分隔符,将值输入到对应的变量中;

       如果默认值过多,最后所有的值都会被赋予给最后一个变量;

       如果默认值过少,多余的变量则为空值;

       示例:

              read a b c

              aa bb cc

       read如何输入:

              echo "请输入一个目录:"

                     我们需要 echo -n 取消换行符号

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

              请输入一个目录:\etc

      

              常用参数:

                     -p

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

                     -t  定义超时时间

                     read -t 5 -p "请输入一个目录:" 变量

             

              脚本默认值

                     [ ! -n $filename ]  &&  filename="zhangjie" 

 

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

                     |                                   |

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

                     |             |                     |                              |

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

             

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

       #!/bin/bash

       #

       read -t 5 -p "输入一个设备文件名:" devname

       [ -z $devname ] && fdisk -l && exit 1

 

       if [ -b /dev/$devname ];then

              fdisk -l /dev/$devname

              exit 0

       else

              echo "$devname 不是设备文件"

              echo "Usage:'请输入一个设备文件,如 sda'"

       fi

 

2、for语句循环  while until

 

       回顾:文件判断脚本;

       #!/bin/bash

       #

       read -p "输入一个文件名:" name

       if [ -z $name ];then

              echo "Usage:'输入一个文件名:/etc/fstab'"

              exit 1

       fi

 

       if [ ! -e $name ];then

              echo "提示:输入的文件不存在!!fool"

              exit 2

       elif [ -f $name ];then

              echo "$name is a file"

       elif [ -d $name ];then

              echo "$name is a dir"  

       elif [ -b $name ];then

              echo "$name is a block file"

       elif [ -L $name ];then

              echo "$name is a Link file"

       else

              echo "$name是其他文件类型"

       fi    

      

       case 语句? -- 做匹配

              case语句的语法格式:

 

              case 变量 in

              PATTEN1)

                     代码块1

                     ;;

              PATTEN2)

                     代码块2

                     ;;

              *)

                     代码库

              esac

 

       -----------------------------------------------

       for语句的应用场景:

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

 

       for语句格式:

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

              for 变量 in 列表;do

                     循环体

              done

 

       99乘法表:

              {1..9}

              #!/bin/bash

              #

              for i in `seq 9`;do

                     for j in `seq 9`;do

                            [ $j -le $i ] && echo -n -e "$i*$j=`echo $(($i*$j))`\t"

                     done

                     echo " "

              done

 

 

              #!/bin/bash

              # 99乘法表

              for i in {1..9};do

                     for j in {0..$i} ; do   ??

                            echo -n -e "$j*$i=$[$i*$j]\t"

                     done

                     echo

              done     

 

 

       echo -e  

              -e : 使echo命令,能够识别 特殊字符;

              \r   回车不换行

              \n  换行符

              \t   制表符 tab = 4个空格

             

       unix2dos  \r\n -- > \n

       dos2unix

 

   3. 列表的生成方式:

  • 直接给出字符串列表

       for i in a b c d e ;do

              循环体

       done

  • 整数列表

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

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

                     步长  python range{1,100,2}

                     seq 20 30

 

              题目:写一个for循环--遍历本网络网段中所有up的电脑

              #!/bin/bash

              # ping遍历

 

              declare -i sum=0

 

              for i in $(seq 1 100);do

                       ping -c 1 -w 1 10.6.12.$i &> /dev/null

                             if [ $? -eq 0 ];then

                                     let sum++

                                     echo "10.6.12.$i 是通的"        

                       else

                                     echo "10.6.12.$i 是不通的"

                             fi

              done

 

              echo "总共有 $sum 台电脑在线"

 

              题目:1到100的偶数和

              #!/bin/bash

              # 偶数和

             

              declare -i sum=0

 

              for i in $(seq 0 2 100);do

                     let sum+=$i

              done

 

              echo “总数为:$sum”

 

  • 返回列表的命令

              $(COMMAND)

              应用场景: ls /var/log/

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

 

              #!/bin/bash

              #

              declare -i sum=0

 

              for i in $(ls /var/log/);do

                     if [ "*.log" = $i ];then

                            echo $i

                            let sum++

                     fi

              done

             

              echo ".log结尾的文件有:$sum"

 

              题目:netstat -tan 查看网络状态,统计 LISTEN 出现的状态次数、ESTABLISHED出现的状态次数、OTHER 状态出现的次数;

             

 

              vim 常见用法:

                     命令模式:

                            dd  剪切

                            5dd

                            p    粘贴

                            yy  复制

                            5yy

                            p    粘贴

 

4、glob机制 -- 文件名通配符的机制

              $(ls /var/log/)

              /var/log/*

             

              test命令总结:

                   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

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

                    test test ==  [[  ]]

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

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

                            [[ yum.log == *.log ]]

                                  

 

 5、变量引用

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

case

while

until

keepalived --  主备 需求:每一个小时去匹配一下主备设备的keepalived的配置文件是否相同?

       hash

       安全:1、加密 2、校验 3、原认证 4、证书认证(不可否性)

              2、校验:hash

函数

字符串处理

数组 

sed

awk

你可能感兴趣的:(shell笔记_read与for语句循环)