shell條件判斷的兩個特殊裝置
/dev/null
linux系統的空裝置,也稱為位桶,任何寫入其中的資料均會被丢棄當你不想将标準化輸出顯示或者儲存至檔案時可以将檔案從定向到/dev/null
禁止标準化輸出 cat $filename > /dev/null
禁止标準化錯誤 rm $filename > /dev/null
/dev/zero
Linux的輸入裝置,可以用他初始化檔案,可以無限制輸出0, 另一個作用是用0去填充一個指定大小的檔案
在條件判斷語句中&&表示and ||表示or
腳本位置參數:
在linux中參數位置從指令後起依次往後,分别是0,1,2,3。。
其中特殊變量有:
$?: 指令的狀态結果;
$#: 傳遞給腳本或函數的參數的個數;
$*和$@: 引用傳遞給腳本或函數的參數清單;
$$:腳本執行時所産生的程序
shift [n]:代表輪替
與使用者互動:
read 用于讀取來自鍵盤的變數
格式: read [-pt] value
-p:後面直接跟提示字元
-t:後面直接接等待的時間『秒數』
[root@iZ28qzns9m4Z bashtest]# echo $a test
whoaaaaa test
[root@iZ28qzns9m4Z bashtest]# read -p "input:" -t 5 a
input:aaaaa
[root@iZ28qzns9m4Z bashtest]# echo $a
aaaaa
[root@iZ28qzns9m4Z bashtest]#
指令引用
格式一: `指令`
格式二:$(指令)
條件判斷語句 if,then,case
隻有一個判斷式的語句格式:
if[條件];then
指令 ==> 當條件為真時執行,若不隻一條時用換行符隔開
fi
需要進行判斷時:
if [條件];then
條件成立時,需要輸入的内容
elif [條件二];then
else
條件與條件一、二均不成立時需要輸入的内容
case的判斷結構也可以用于多分支:
文法格式:
case $變量名稱 in
"第一變量内容")command指令;;
"第二變量内容")command指令;;
"第三變量内容")command指令;;
"第四變量内容")command指令;;
...
*)command指令;;===》在以上條件均不比對的條件下執行
esac:
循環語句:for while until
在linux 循環語句中 list 是一個重 點,他負責循環時所需要的清單元素,是由一個或多個空格或換行符分隔開的字元串組成,把清單的每個字元串逐個指派給VARIABLE表示的變量;
生成格式:
數字:① list="1 2 3 4 5 6 10" ==》 for var in ${list}
② for var in {1..10}
[root@iZ28qzns9m4Z bashtest]# cat 1for.sh
#!/bin/bash
#
#list="1 2 3 4 5 6 10" #第一種
#for i in ${list}
#do
# echo $i
#done
===================================
for i in {1..10} #第二種
do
echo $i
done
[root@iZ28qzns9m4Z bashtest]#
(2) 直接給出清單
(3) glob
#!/bin/bash
#
for filename in /相對具體的路徑/*; do
file $filename
done
注:如果不是相對具體的路徑,那麼腳本會報錯,filename隻搜尋相對一級路徑下的内容不對第二級子目錄進行分析
(4) 指令生成
算術運算:
+, -, *, /, %, **
(1) $[$A+$B]
(2) $(($A+$B))
(3) let VARIABLE=$A+$B
(4) VARIABLE=$(expr $A + $B)
增強型指派:
+=
sum=$[$sum+$i]
let sum+=$i
-=, *=, /=, %=
let count=$[$count+1] --> let count+=1 --> let count++
let count=$[$count-1] --> let count-=1 --> let count--
[root@iZ28qzns9m4Z bashtest]# sh 4for-2.sh
2500
[root@iZ28qzns9m4Z bashtest]# cat 4for-2.sh
#!/bin/bash
sum=0
for i in $(seq 1 2 100)
do
let "sum+=i"
done
echo $sum
[root@iZ28qzns9m4Z bashtest]#
for 運作前測試語句,用于建立重複循環
格式: for var in ${list}
do
循環指令
done
不帶清單的for循環
格式: for var
do
循環指令
done
while循環:
while CONDTION;
do
循環體
done
進入條件:當CONDITION為“真”;
退出條件:當CONDITION為“假”;
while CONDITION;
控制變量的修正表達式
while :
command
until 循環:
until指令和while指令類似,while能實作的腳本until同樣也可以實作,但差別是until循環的退出狀态是不為0,退出狀态是為0(與while剛好相反),即whie循環在條件為真時繼續執行循環而until則在條件為假時執行循環。
文法格式:
until expression
[root@iZ28qzns9m4Z bashtest]# cat 1until.sh
#!/bin/bash
declare -i sum=0
declare -i i=1
until [[ "$i" -gt 10 ]]
do
let sum+=i
let i++
done
echo $sum
[root@iZ28qzns9m4Z bashtest]# sh -x 1until.sh
+ declare -i sum=0
+ declare -i i=1
+ [[ 1 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 2 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 3 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 4 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 5 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 6 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 7 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 8 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 9 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 10 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 11 -gt 10 ]]
+ echo 55
55
[root@iZ28qzns9m4Z bashtest]#
循環控制:
continue [n]:提前結束本輪循環,而直接進入下一輪;
break [n]:提前結束循環;
while CONDITION; do
.......
if CONDITION2; then
break [n]
fi
[root@iZ28qzns9m4Z bashtest]# cat 1until.sh
#!/bin/bash
declare -i sum=0
declare -i i=1
until [[ "$i" -gt 10 ]]
do
let sum+=i
let i++
if [ $i -eq 5 ]; then
break
fi
echo $sum
done
[root@iZ28qzns9m4Z bashtest]# sh -x 1until.sh
+ declare -i sum=0
+ declare -i i=1
+ [[ 1 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 2 -eq 5 ']'
+ echo 1
1
+ [[ 2 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 3 -eq 5 ']'
+ echo 3
3
+ [[ 3 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 4 -eq 5 ']'
+ echo 6
6
+ [[ 4 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 5 -eq 5 ']'
+ break
[root@iZ28qzns9m4Z bashtest]#
......
continue [n]
死循環:
while true; do
循環體
if CONDTION; then
break
until false; do
if CONDITION; then
while循環的特殊用法:
周遊檔案的每一行:
while read VARIABLE; do
循環體
done < /PATH/FROM/SOME_FILE
for循環的特殊用法:
for ((expr1;expr2;expr3)); do
expr1: 定義控制變量,并初始指派;
expr2: 循環控制條件;
進入條件:控制條件為“真”