數(shù)字比較
```
-eq? ? ? 等于,如:if [ "$a" -eq "$b" ]
-ne? ? ? 不等于,如:if [ "$a" -ne "$b" ]
-gt?? ??? 大于,如:if [ "$a" -gt "$b" ]
-ge?? ??? 大于等于,如:if [ "$a" -ge "$b" ]
-lt?? ??? 小于,如:if [ "$a" -lt "$b" ]
-le?? ??? 小于等于,如:if [ "$a" -le "$b" ]
<?? ??? 小于(需要雙括號),如:(("$a" < "$b"))
<=?? ??? 小于等于(需要雙括號),如:(("$a" <= "$b"))
>?? ??? 大于(需要雙括號),如:(("$a" > "$b"))
>=?? ??? 大于等于(需要雙括號),如:(("$a" >= "$b"))
字符串比較
=? ? ? 等于,如:if [ "$a" = "$b" ]
==?? ??? 等于,如:if [ "$a" == "$b" ],與=等價(jià)
注意:==的功能在[[]]和[]中的行為是不同的,如下:
1 [[ $a == z* ]]??? # 如果$a以"z"開頭(模式匹配)那么將為true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么結(jié)果為true
3
4 [ $a == z* ]????? # File globbing 和word splitting將會發(fā)生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么結(jié)果為true
一點(diǎn)解釋,關(guān)于File globbing是一種關(guān)于文件的速記法,比如"*.c"就是,再如~也是.
但是file globbing并不是嚴(yán)格的正則表達(dá)式,雖然絕大多數(shù)情況下結(jié)構(gòu)比較像.
!=?? ??? 不等于,如:if [ "$a" != "$b" ]
這個(gè)操作符將在[[]]結(jié)構(gòu)中使用模式匹配.
<?? ??? 小于,在ASCII字母順序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]結(jié)構(gòu)中"<"需要被轉(zhuǎn)義.
>?? ??? 大于,在ASCII字母順序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]結(jié)構(gòu)中">"需要被轉(zhuǎn)義.
具體參考Example 26-11來查看這個(gè)操作符應(yīng)用的例子.
-z?? ??? 字符串為"null".就是長度為0.
-n?? ??? 字符串不為"null"
注意:
使用-n在[]結(jié)構(gòu)中測試必須要用""把變量引起來.使用一個(gè)未被""的字符串來使用! -z
或者就是未用""引用的字符串本身,放到[]結(jié)構(gòu)中。雖然一般情況下可
以工作,但這是不安全的.習(xí)慣于使用""來測試字符串是一種好習(xí)慣.
```
流程控制語句
if語句
```
1:在shell 中$() 與 ``等效。執(zhí)行中間包含的命令語句,返回執(zhí)行結(jié)果。
2:從效率來說let==(()) > expr > bc。let和(())運(yùn)行是內(nèi)建命令,使用相同的算法。
3:let 和 expr 的運(yùn)算是整數(shù)運(yùn)算,不包括浮點(diǎn)預(yù)算。
4:expr和bc是外部程序,expr的體積幾乎等于bc的1/3,執(zhí)行一次裝入內(nèi)存所消耗的時(shí)間就不一樣。
5:從運(yùn)算能力來說,bc排第一位。
shell的循環(huán)主要有3種,for,while,until
shell的分支判斷主要有2種,if,case
#if語句的后面是Shell命令,如果該命令執(zhí)行成功返回0,則執(zhí)行then后面的命令。
if command
then
command
command
fi
#用test命令測試其后面expression的結(jié)果,如果為真,則執(zhí)行then后面的命令。
if test expression
then
command
fi
#下面的格式和test expression等同
if [ string/numeric expression ]
then
command
fi
#下面的兩種格式也可以用于判斷語句的條件表達(dá)式,而且它們也是目前比較常用的兩種。
if [[ string expression ]] #這種方式支持通配符,上面的那種不支持
then
command
fi
if (( numeric expression )) #let表達(dá)式
then
command
fi
```
for語句
```
for i in f1 f2 f3
for i in {1..5}
for i in $a
for i in $(ls $a)
for i in $(seq 100)
for i in `ls *.sh`
for i in `seq 100`
for ((i=0;i<5;i++))
for i in ${arr[@]}
for i in $*
for f in /proc/sys/net/ipv4/conf/*/arp_accept
默認(rèn)分隔符是空格,而不管是幾個(gè)空格。多個(gè)空格也當(dāng)一個(gè)來處理。
第一種情況,可以直接寫入字符串
[root@250-shiyan sh]# cat > for
for f in 1 2 3? 4? 5
do
echo $f
done
[root@250-shiyan sh]# bash for
2
4
一定要寫成兩個(gè)點(diǎn)號,一個(gè)或多于二個(gè)都不行
[root@250-shiyan sh]# cat > for
for i in {1..5}
do
echo $i
done
[root@250-shiyan sh]# bash for
2
4
###第二種情況,可以寫變量名
[root@250-shiyan sh]# cat > for
IFS=':'
a="root:x:0:0:root:/root:/bin/bash"
for f in $a
do
echo $f
done
[root@250-shiyan sh]# bash for
root
x
0
root
/root
/bin/bash
###第三種情況,可以寫命令
[root@250-shiyan sh]# cat > for
a="/root/sh"
for f in $(ls $a)
do
echo "file-i:$f"
done
[root@250-shiyan sh]# bash for
file-i:aa
file-i:ab
file-i:ac
file-i:awk
file-i:ccc
file-i:cfont
file-i:check-root.sh
[root@250-shiyan sh]# cat > for
for f in `ls *.sh`
do
name=`echo "$f"|awk -F. '{print $1}'`
echo $name
done
[root@250-shiyan sh]# bash for
check-root
eth
for
ser
###查找循環(huán)(ls數(shù)據(jù)量太大的時(shí)候也可以用這種方法)
[root@250-shiyan sh]# cat > for
for f in `find . -type f -name "*.sh"`
do
name=`echo "$f"|awk -F/ '{print $2}'`
echo $name
done
[root@250-shiyan sh]# bash for
eth.sh
ser.sh
check-root.sh
for.sh
[root@250-shiyan sh]# cat > for
for f in `seq 100` 或者for f in $(seq 100)
do
if((f%4==0))
then
echo $f
continue
fi
done
[root@250-shiyan sh]# bash for
8
16
24
###第四種情況,for((賦值;條件;運(yùn)算語句)),c語法的for循環(huán)形式
[root@250-shiyan sh]# cat > for
for((i=0;i<=5;i++))
do
echo $(expr $i \* 3)
done
[root@250-shiyan sh]# bash for
3
9
15
[root@250-shiyan sh]# cat > for
for((i=1;i<100;i++))
do
if((i%3==0))
then
echo $i
continue
fi
done
[root@250-shiyan sh]# bash for
6
12
18
[root@250-shiyan sh]# cat > for
arr=("a" "b" "c")
for f in ${arr[@]}
do
echo $f
done
[root@250-shiyan sh]# bash for
a
b
c
[root@250-shiyan sh]# cat > for
for f in $*
do
echo $f
done
[root@250-shiyan sh]# chmod u+x for
[root@250-shiyan sh]# ./for a b c d e f
a
b
c
d
e
f
[root@250-shiyan sh]# cat > for
for f in /proc/sys/net/ipv4/conf/*/arp_accept
do
echo $f
done
[root@250-shiyan sh]#
[root@250-shiyan sh]# bash for
/proc/sys/net/ipv4/conf/all/arp_accept
/proc/sys/net/ipv4/conf/default/arp_accept
/proc/sys/net/ipv4/conf/eth0/arp_accept
/proc/sys/net/ipv4/conf/lo/arp_accept
###直到滿足條件,就退出。否則執(zhí)行echo
[root@250-shiyan sh]# cat > until
f=5
until [ $f -lt 0 ]
do
echo $f
((f--))
done
[root@250-shiyan sh]# bash until
4
2
0
[root@84-monitor test]# bash loop
pass 1 in outer_loop
-------------------------
pass 1 in inner_loop
pass 2 in inner_loop
pass 3 in inner_loop
pass 4 in inner_loop
pass 5 in inner_loop
pass 2 in outer_loop
-------------------------
pass 1 in inner_loop
pass 2 in inner_loop
pass 3 in inner_loop
pass 4 in inner_loop
pass 5 in inner_loop
pass 3 in outer_loop
-------------------------
pass 1 in inner_loop
pass 2 in inner_loop
pass 3 in inner_loop
pass 4 in inner_loop
pass 5 in inner_loop
pass 4 in outer_loop
-------------------------
pass 1 in inner_loop
pass 2 in inner_loop
pass 3 in inner_loop
pass 4 in inner_loop
pass 5 in inner_loop
pass 5 in outer_loop
-------------------------
pass 1 in inner_loop
pass 2 in inner_loop
pass 3 in inner_loop
pass 4 in inner_loop
pass 5 in inner_loop
[root@84-monitor test]# cat loop
outer=1
for a in 1 2 3 4 5
do
echo "pass $outer in outer_loop"
echo "-------------------------"
inner=1
for b in 1 2 3 4 5
do
echo "pass $inner in inner_loop"
let "inner+=1"
done
let "outer+=1"
echo
done
[root@84-monitor test]#
```