交互輸入與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