挨踢(IT)

case,while,awk,set

2019-08-07  本文已影响0人  快去学习不然怎么去看aimer

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
上一篇 下一篇

猜你喜欢

热点阅读