shell腳本編程基礎第二篇
read命令
使用read來把輸入的值非配給一個或者多個shell變量,可以提示用戶輸入一些參數等,此時我們可以使用read命令來完成此功能
read
[選項] [名稱]
read -p 指定要顯示的提示信息
read -t 聲明超時
注意:1
當我們寫完一個腳本后,需要對腳本進行語法檢查,如果發現語法不對,我們可以進行修改,
語法檢測命令:bash -n
/path/to/some_scripts
2
完成語法測試后,還可以進行功能測試,可以說是調試,也可以加上執行權限后運行,可以通過bash所提供的調試功能來進行運行測試
運行調試命令:bash -x /path/to/some_scripts
read
從標準輸入中讀取值,給每一個單詞分配一個變量,所有剩余的單詞都被分配給最后一個變量
read -p "who ar you?:" file
流程控制
過程式編程語言:
順序執行
按照順序一條一條的語句執行
選擇執行 按照條件進行選擇執行
循環執行
按照給定的循環條件進行循環執行
其中的順序執行不需要特定的控制,只需要按照語句依次執行即可;
選擇執行,則需要特定的控制語句 例如
if、case 來判斷選擇執行;
循環執行,則需要特定的循環控制體來控制 例如 for、while
條件選擇if語句
if語句可以嵌套
選擇執行:
單分支:if 判斷條件;then
語句開頭
條件為真的分支代碼
fi 語句結尾
雙分支:if 判斷條件;then 語句開頭
條件為真的分支代碼
else
條件為假的分支代碼
fi 語句結尾
多分支結構:if 命令1;then
語句開頭
if-true
elif
命令2;then
if-true
elif
命令3;then
if-true
else
all-false
fi 語句結尾
逐條件進行判斷,第一次遇到為真條件時,執其他分支,而后結束真個if語句
條件判斷:case語句
case 變量引用 in
模式1)
分支1 命令1
;;
模式2)
分支2
命令2
;;
*)
默認分支
;; 從上到下的進行判斷條件
esac
ease 支持 glob風格的通配符
*
任意長度任意的字符
? 任意單個字符
[]
指定范圍內的任意單個字符
a|b
a或b
shell 腳本
循環
循環執行 for , while , until
就是程序按照一定的條件反復進行執行相關操作,知道不在滿足循環條件是結束,這里面的重點就是這個循環體
循環體包括兩部分,循環的進入條件和循環的退出條件,兩個部分必須同時存在 否則將無法進入循環內部,或者循環無法結束,導致系統崩潰
重復運行多少次:
循環次數事先已知
循環次數事先未知
for循環
for 變量名 in 列表;do
循環體
done
例如:
#!/bin/bash
#user:Compro
for i
in 1 2 3 4;do
echo "$i"
done
編輯腳本,i是定義的變量名稱,1234 是變量的值,然后循環打印輸出
執行機制:一次將列表中的元素賦值給“變量名”;每次賦值后即執行一次循環體;知道列表中的元素好近,循環才結束。
列表生成的方式:
1直接給出列表
2整數列表:
{start…end}
例如:{1..10}
seq start step end 例如:$(seq 1 2
10)
3返回列表的命令:
$(命令) 例如:$(ls
/var)
位置變量參數:在腳本中用于引用傳遞給腳本的參數
$1,$2,,${10},,
特殊變量:
$? 保存上一條命令的執行結果成功與否的狀態,用數字來表示,0-255;
0表示成功,其他則為失敗
$0 在腳本中用于引用傳遞腳本名稱本身
$#
保存傳遞給當前腳本的參數的個數
$* 保存傳遞給當前腳本的所有參數
$@
保存傳遞給當前腳本的所有參數 兩個在不同的地方用會產生不同的效果
練習
[root@localhost
~]# vim forrc.d.sh
#!/bin/bash
#user:Compro
# /etc/rc.d/rc3.d
目錄下分別有多個以 K 開頭和以 S 開頭的
# 文件;分別讀取每個文件,以 K 開頭的文件輸出為文件加 stop
# ,以 S
開頭的文件輸出為文件名加 start ;
for i in `ls /etc/rc.d/rc3.d`
循環定義i為變量名,in之后跟變量的值,也就是ls /etc/rc.d/rc3.d 查看目錄的命令
do
filef1=`echo
$i |cut -c1` 定義變量名= 引用上面的變量名i 抽取內容開頭第1列
case $filef1
in 條件判斷,case語句,調用上面的變量filef1
K) 匹配大寫K 然后才執行引用的變量值
echo -e
"$i\tstop" 輸出引用變量后的結果 后綴加上tstop
;;
S) 匹配大寫S 然后才執行引用的變量值
echo -e
"$i\tstart" 輸出引用變量后的結果 后綴加上tstart
;;
*) 任意長度任意字符
echo "unkown
file"
;;
esac
done
[root@localhost ~]# vim
shuzizonghe.sh
#!/bin/bash
#user:Compro
#提示輸入正整數n的值,計算1+2+3+4+…n的總和
read
-p 'please input the number:' n 說明信息,提示信息, 請輸入數字
num=`echo $n |grep
"^[[:digit:]]\+$"` 定義變量名num = 調用$n的變量,查詢開頭是數字, \+匹配前面字符至少一次$行尾錨定
if
"$num";then 判斷條件調用上面變量
if [
$num -eq 0 ];then 變量值是否等于0
echo "the umber is 0"
輸入數字為0 則提示這數字為0
exit 并且退出,不再往下面條件判斷
fi
else
echo "the number is negative"
如果輸入的是負數就提示這條信息
fi
string=0
字符串=0
for i in `seq
$n`;do 定義變量名i 后面列表的seq調后$n的值
sum=$[$sum+$i] 定義變量名sum =調后變量 總計 + $i 的數值
string=$string+$1 字符串 = 輸入的字符串 + 變量1
done
echo
"$string=$sum" 輸出結果 為 輸出的變量字符串=數值在原有的基礎上相加
[root@localhost ~]# vim forip.sh
#!/bin/bash
#user:Compro
#
寫一個腳本,提示請輸入網絡地址,如 192.168.0.0 ,判斷輸入的網段中主機在>線狀態
#255.255.255.0
echo -n
"IP:" 提示輸入IP
read IP 說明信息IP
ipdizi=`echo $IP | cut -d. -f1-3
`. 定義變量名稱=調用$IP獲取的值 抽取 以.為分隔符 1-3的字符
#
if echo $IP | egrep
'\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
&>/dev/null
then
ip地址擴展表達式
for i in `seq 200 210`
定義變量名i 列表內容為 seq 200 100 之間的數字
do
if ping -c 1 -W 1 $ipdizi$i
&> /dev/null 調用$ipdizi $i 的值 重定向到文件 不顯示出來
then
echo -e "$ipdizi$i\tonline" 顯示在線的IP
else
echo -e
"$ipdizi$i\toffline" 顯示不在線的IP
fi
[root@localhost ~]# vim
for99.sh
#!/bin/bash
#uesr:Compro
#打印99乘法表
for i in `seq
9` 定義變量名i 列表內容為seq 9 生成1-9的數字的行
do
for o in `seq 1
$i` 定義變量名o 列表內容為 seq 1 $i 1循環到 $i變量值 第1行就打印1遍,第2行就打印2遍,,,
do
echo -ne "$i*$o=$(($i*$o))\t" $i的值*$o的值= $變量中的結果 ~]#
echo -ne "5*5=$((5*5))\t" 結果是25 \t 是在每一行 空白符隔開
done
echo
done
while 循環
while CONDITION;do
condition狀態就是判斷式
循環體 do是循環的開始
done
done是循環的結束
~]# i=1;while [ $i -le 9 ];do echo $i;let i++;done
當變量i的值1于等于9
循環打印,在原有的1上面做運算++。直到9為止
condition
循環控制條件;進入循環之前,先做一次判斷,每一次循環之后會再次做判斷;條件為‘true’ (真)則執行一次循環,知道條件測試狀態為‘false’
(假)終止循環
因此:condition 一般應該有循環控制變量,而此變量的值會在循環體不斷的被修正
進入條件 condition 為true 真
。 退出條件:condition為false 假
[root@localhost ~]# vim
while100.sh
#!/bin/bash
#
#user:Compro
#求100以內所有正整數之和
i=1 定義變量i的值=1
sum=0 sum=0
while [ $i -le
100 ];do $i 小于等于 100 就執行循環,
sum=$(expr $sum +
$i) $ 運算$sum + $i的值 定義為變量sum
let i++
i++ 遞增運算 然后循環判斷,直到判斷i是否小于至等于100
done
echo $sum
[root@localhost ~]# vim
whileping.sh
#!/bin/bash
#
#user:Compro
#ping范圍內的所有主機在線狀態,統計在線主機和離線主機個多少個
a="10.1.252."
定義變量值,ip范圍
b=1
最小1開始的值
c=0
d=0
while [ $b -le 10 ];do 判斷循環條件 $b
是否小于等于 10 從1循環到10
ping -c1 -W1 $a$b &> /dev/null
ping的結果導入到別的文件中 不顯示出來
if [ $? -eq 0 ];then 調用上面的值
判斷是否等于0
echo "$a$b is yes" 如果成功,則打印yes
let
c++ c++ 遞增運算 判斷上面的結果隨之遞增
else
echo "$a$b is no" 如果上面的失敗,判斷為no
let
d++ d++ 遞增運算 判斷上面的結果隨之遞增
fi
let b++ 遞增運算循環 ,
不加這個就了死循環,
done
echo "yes users is $c" 調用c的變量結果
統計了yes的次數
echo "no users is $d" 調用d的變量結果 統計了no的次數
[root@localhost ~]# vim whil99.sh
#!/bin/bash
#
#uesr:Compro
#打印99乘法表
s=1
定義變量s=1 s可以理解豎
while [ $s -le 9 ];do 判斷條件循環,$s 小于等9
h=1 定義變量名h=1 可以理解行
while [ $h -le $s ];do 判斷條i安,$h小于等于#s
shuzi=$[$s*$h] 數值=$s*$h的結果
echo -ne
"$s*$h=$shuzi\t" 輸出顯示上面的結果 \t 空格隔開
let
h++ 遞增運算 $h 的結果 執行9遍
done
echo
let s++ 遞增運算 $s 的結果
執行9遍
done
[root@localhost ~]# vim xiangqi.sh
#!/bin/bash
#
#Compro
#打印國際象棋棋盤
i=1
定義變量值
while [ $i -le 8 ];do 判斷循環,$i 小于等于8
j=1
while [ $j -le 8 ];do 判斷循環,$j 小于等于8
sum=`expr $i + $j` 定義變量=運算 $i + $j
z=`expr $sum % 2` 上面結果的取模,取余, 每一行每一列進行相加1+1=2 %2=0 1+2=3
%2=1
[ $z -eq 0 ] && echo -ne "\033[41;1m
\033[0m"||echo -ne "\033[43;1m \033[0m" 變量z 小于等于0 就打印紅色,
其它則打印黃色
let j++ 遞增運算
循環
done
echo
let
i++ 遞增運算 循環
done
until 循環
until codition;do
循環體
done
這種方式,跟while循環 恰恰相反,這個說的是當condition 條件成立時,就終止循環,
進入條件: codition 為 false
(假) 退出條件:condition 為 frue (真)
循環控制語句 continue ; break
用于循環體中
退出當此的循環
例如
#/bin/bash
i=1
unntil [ $i -gt 10 ];do 條件判斷循環 變量i
是否大于 10
echo $i
let i++
在原有的值上面遞增運算
[ $i -eq 5 ] && continue 條件判斷,$i 是否等于5 ,
執行退出此次循環命令 ,而不是全部退出循環,只是退出匹配條件的循環
echo sss
顯示sss分隔符。 當循環到5的時候停止。 在次從5開始又一次的循環
done
例如
#/bin/bash 打斷,中斷,停止此次循環。
i=1
unntil [ $i
-gt 10 ];do 條件判斷循環 變量i 是否大于 10
echo $i
let
i++ 在原有的值上面遞增運算
[ $i -eq 5 ] && break
條件判斷,$i 是否等于5 ,當等于5的時候 ,停止退出此次循環。
echo sss 顯示sss分隔符。
當循環到5的時候停止。
done
echo sss 這個不再循環體之內的字符, 是可以輸出顯示出來的。
[root@localhost
~]# vim
caicai.sh
#!/bin/bash
#
#user:Compro
#隨機生成10以內的數字,實現猜數字游戲,提示提大會或者小,相等則退出
sj=$[$RANDOM%10+1]
定義變量名稱=取模隨機數10之內的
read -p "請輸入數字:" sr 交互提示用戶信息,
sr是下面準備用的變量
until [ $sj -eq $sr ];do 判斷循環,$sj隨機變量 等于
輸入$sr變量, until條件成立時,就終止循環
#結果提示
[ $sr -lt $sj ] && echo
"x" 輸入的小于隨機 則提示小。
[ $sr -gt $sj ] && echo
"d" 輸入的大于隨機 則提示大。
read -p "請輸入數字:" sr
只要是沒輸入跟隨機相等的數字,則一直提示輸入
done
echo "game over!"
當上面條件結束時 ,則提示游戲結束
運行腳本 [root@localhost ~]# bash caicai.sh
請輸入數字:1 輸入1
x 提示小
請輸入數字:5
輸入5
d 提示大
請輸入數字:3 輸入3
game
over! 游戲結束 證明腳本生成的隨機數是3,相等則退出
原創文章,作者:小馬哥,如若轉載,請注明出處:http://www.www58058.com/37488