case,while,awk,set

作者: 快去学习不然怎么去看aimer | 来源:发表于2019-08-07 19:14 被阅读0次

    case分支

    基本语法:

    case  $变量名称 in   <==关键字为 case ,还有变量前有钱字号
      "第一个变量内容")   <==每个变量内容建议用双引号括起来,关键字则为小括号 )
        程序段
        ;;            <==每个类别结尾使用两个连续的分号来处理!
      "第二个变量内容")
        程序段
        ;;
      *)                  <==最后一个变量内容都会用 * 来代表所有其他值
        不包含第一个变量内容与第二个变量内容的其他程序运行段
        exit 1
        ;;
    esac                  <==反过来写,结束当前语句结构!
    

    Ps:

    . ./my-functionlib
    cat <<eof
    1 cpu info
    2 mem info
    3 disk info
    4 network
    q exit
    eof
    while true
    do
        read -p ">:" choice
        case ${choice} in
        1)
            get_cpu 
        ;;              
        2)
            get_mem
        ;;              
        3)
            get_disk
        ;;              
        4)
            get_network
        ;;
        q|Q)
            exit 1 
        ;;             
        *)
            echo "重新输入"
        ;;              
        esac
    done
    在函数库中:
     get_cpu () {
        cpu_core_num=$(grep 'model name' /proc/cpuinfo|uniq -c)
        echo "${cpu_core_num}"
    }
    
    get_mem () {
        mem_core=$(free | grep -B1 "Mem" )
        echo "mem info ${mem_core}"
    }
    
    get_disk () {
        disk_core=$(df -h | grep -B1 "/dev/mapper" )
        echo "disk info ${disk_core}"
    }
    
    get_network () {
        network_core=$(ip a | grep -A5 "ens33:")
        echo " network ${network_core}"
    }
    相当于在脚本里调用函数
    

    || &&(当然,他们的位置可以变动)

    cd /u || mkdir /u && touch /u/a.txt  当有目录u时,创建a.txt。没有目录u时,创建目录u,创建a.txt
    

    while循环

    while [ condition ]  ==>中括号内的状态就是判断式
    do            ==> do 是循环的开始!
        代码段
        代码段
    done          ==> done 是循环的结束
    Ps:
    在上面的例子里,外层循环使得可以重复接收值
    

    for循环

    IFS=$"\n"   定义换行符为分隔符
    for i in {2..254}
    do
        ping -c 1 -W 1 10.0.122.$i
        if [ "$?" -eq 0 ];then
            echo "10.0.122.$i" >> ./ipt.txt
        else
            echo "10.0.122.$i" >> ./ipf.txt
        fi
    done
    IFS=$IFS
    Ps:
    使用自己的ip去ping本网段所有的ip,将能通的ip输入到ipt.txt,将不能通的ip输入ipf.txt
    

    break

    for i in {1..7}
    do
        for w in a b c d
        do
            if [ $w -eq 4 ];then
                break
            fi
            echo "$i ==> $w"
        done
    done
    如果写成break 2 就是跳出两层循环
    跳出本次循环,得到结果
    1 ==> a
    1 ==> b
    1 ==> c
    1 ==> d
    2 ==> a
    2 ==> b
    2 ==> c
    2 ==> d
    3 ==> a
    3 ==> b
    3 ==> c
    3 ==> d
    5 ==> a
    5 ==> b
    5 ==> c
    5 ==> d
    6 ==> a
    6 ==> b
    6 ==> c
    6 ==> d
    7 ==> a
    7 ==> b
    7 ==> c
    7 ==> d
    

    continue

    for i in {1..7}
    do
            if [ $i -eq 4 ];then
                continue
            fi
            echo "$i "
    done
    Ps:
    得到的结果:
    1 
    2 
    3 
    5 
    6 
    7 
    

    awk

    记录变量

    $0 : 当前正在处理的行内容
    NR : 当前正在处理的行是 awk 总共处理的行号。
    FNR: 当前正在处理的行在其文件中的行号。
    NF :每行被处理时的总字段数
    $NF : 每一行的最后一列
    $NR :选出第一行
    

    格式化输出

    [root@rourou ~]# awk -F: '{printf "%-15s %-10s %-15d\n",$1,$2,$3}' /etc/passwd
    root            x          0              
    bin             x          1              
    daemon          x          2              
    adm             x          3              
    lp              x          4              
    sync            x          5              
    shutdown        x          6 
    

    第一位的值空15个字符型的空,第二位的值空10个字符型的空,第三位的值空15个整形的空
    规定:

    %s 字符类型
    %d 数值类型
    %f 浮点类型
    %-15s占15字符 - 表示左对齐,默认是右对齐
    printf 默认不会在行尾自动换行,加 \n
    

    正则表达式

    awk '/^root/' /etc/passwd             查找以root为开头的行
    awk '$0 ~ /^root/' /etc/passwd    与上一行一样
    awk '!/root/' passwd                    包含root的行 
    awk '$0 !~ /^root/' /etc/passwd    与上一行相同
    

    ~为正则匹配,!取反

    Ps:

    [root@rourou ~]# awk -F: '$3 == 0' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    查找第三列为0的行
    同样的可以得到:
    awk -F: '$3 < 10' /etc/passwd
    awk -F: '$NF == "/bin/bash"' /etc/passwd
    awk -F: '$1 == "root"' /etc/passwd
    

    条件表达式

    awk -F: '$3>300 {print $0}' /etc/passwd
    awk -F: '{ if($3>300) print $0 }' /etc/passwd
    awk -F: '{ if($3>300) {print $0} }' /etc/passwd
    awk -F: '{ if($3>300) {print $3} else{print $1} }' /etc/passwd
    

    set

    -u:当遇到未定义的参数是报错,并且下面的命令不会再执行

    set -u
    echo $rourou   就会得到下面的提示
    break.sh: line 13: rourou: unbound variable
    但是
    echo $rourou
    就不会报错
    

    -x:显示执行每行指令的具体过程

    for i in {1..7}
    do
        for w in a b c d
        do
            if [ $i -eq 4 ];then
                break
            fi
            echo "$i ==> $w"
        done
    done
    若不执行set -x 得到    (截取的一部分)
    1 ==> a
    若执行set -x  得到
    + for i in '{1..7}'
    + for w in a b c d
    + '[' 1 -eq 4 ']'
    + echo '1 ==> a'
    1 ==> a
    

    set -e脚本中有任何命令的返回值是非零,脚本则停止继续执行。

    set -e
    for i in {1..7}
    do
        for w in a b c d
        do
            if [ $i -eq 4 ];then
                var
            fi
            echo "$i ==> $w"
        done
    done
    得到的结果
    1 ==> a
    1 ==> b
    1 ==> c
    1 ==> d
    2 ==> a
    2 ==> b
    2 ==> c
    2 ==> d
    3 ==> a
    3 ==> b
    3 ==> c
    3 ==> d
    break.sh: line 8: var: command not found
    

    相关文章

      网友评论

        本文标题:case,while,awk,set

        本文链接:https://www.haomeiwen.com/subject/lwbbdctx.html