shell編程

數(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]#

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Bash內(nèi)置基本變量 PWD : 顯示當(dāng)前的工作目錄 OLDPWD : 顯示上一次的工作目錄 ~:用戶家目錄 - ...
    魏鎮(zhèn)坪閱讀 1,665評論 0 6
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,926評論 0 33
  • mllib 數(shù)據(jù)類型Local Vector :整數(shù)索引下標(biāo),從0開始;存儲double類型的值,而且只存儲在單臺...
    typedef708閱讀 904評論 0 0
  • 菩提本無樹 心兒修道一樣 守著窗外的玉柳從春到秋 守著隔壁 荷塘月色 獨(dú)自好生守著晨昏 守著夢中相依的 就不...
    紫藤小妮子閱讀 203評論 0 1
  • 《2014/2月》 2/7晚上19:46分坐上了漢口—揚(yáng)州的硬座,真他媽再也不想做硬座了,人太多空氣特別差,不透氣...
    Spring柴柴閱讀 241評論 0 0

友情鏈接更多精彩內(nèi)容