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
网友评论