shell脚本的for循环与read
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
shell脚本的for循环与read 交互输⼊与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个空格
--------------------------------------------------------------------------------------------------------------------------------列表的⽣成⽅式:
1、直接给出字符串列表
for i in a b c d e ;do
循环体
done
2、整数列表
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”
3、返回列表的命令
$(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命令总结:
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循环的列表
case
while
until
keepalived -- 主备需求:每⼀个⼩时去匹配⼀下主备设备的keepalived的配置⽂件是否相同?hash
安全:1、加密 2、校验 3、原认证 4、证书认证(不可否性)
2、校验:hash
函数
字符串处理
数组
sed
awk。