小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

「shell入門到精通」 一文帶你熟悉shell腳本的各種表達(dá)式

 啟云_9137 2020-10-29

作者:老油條IT記

公眾號(hào):老油條IT記

#前言:在shell腳本中,有各種的表達(dá)式,包括有條件測(cè)試表達(dá)式,文件表達(dá)式,字符串表達(dá)式,整數(shù)表達(dá)式,接下來(lái)我們來(lái)了解一下他們的使用方法

1.條件測(cè)試表達(dá)式

#首先來(lái)看一下條件測(cè)試語(yǔ)法

#條件測(cè)試語(yǔ)法 #說(shuō)明1.test <測(cè)試表達(dá)式> test命令和后面<內(nèi)容>之間至少有一個(gè)空格2.[ <測(cè)試表達(dá)式> ] 單中括號(hào)進(jìn)行條件測(cè)試表達(dá)式,[]的邊界和內(nèi)容之間至少要有一個(gè)空格3.[[ <測(cè)試表達(dá)式> ]] 雙括號(hào),[[]]的邊界和內(nèi)容也是要有空格4.((<測(cè)試表達(dá)式>)) 雙小括號(hào),兩端不用空格

#注意點(diǎn)

1、語(yǔ)法1中的test命令和語(yǔ)法2中的[]是等價(jià)的。語(yǔ)法3中的[[]]為擴(kuò)展的test命令,語(yǔ)法4中的(())常用于計(jì)算

2、在[]中可以使用通配符等進(jìn)行模式匹配,這是其區(qū)別其他集中語(yǔ)法格式的地方

3、&&、||、>、<等操作符可以應(yīng)用于[[]]中,但不能應(yīng)用于[]中,在[]中一般用-a、-o、-gt(用于整數(shù))、-lt(用于整數(shù))代替上述操作符

4、對(duì)于整數(shù)的關(guān)系運(yùn)算,也可以使用shell的算術(shù)運(yùn)算符(())

#詳解

#1.1.test條件測(cè)試的語(yǔ)法和使用

#查看幫助:man test

#介紹:test - check file types and compare values(檢查文件類型和比較值)

#語(yǔ)法格式:test <測(cè)試表達(dá)式>

#test的幫助文檔

[root@shell ~]# man test > 1.txt

[root@shell ~]# cat 1.txt

#使用

#例一:判斷如果file文件存在且為一個(gè)文件,就輸出true,否則輸出false

[root@shell ~]# test -f file && echo true || echo false

false

#講解:因?yàn)閒ile這個(gè)文件不存在,所以輸出false,&&是并且的意思,||表示前面一個(gè)執(zhí)行失敗才會(huì)執(zhí)行后面

#例二:使用-z選項(xiàng)(如果測(cè)試字符串的長(zhǎng)度為0,則表達(dá)式成立)

[root@shell ~]# test -z 'guoke' && echo 1 || echo 00  #因?yàn)闇y(cè)試的字符串為guoke,不為空值,所以為假輸出0

[root@shell ~]# char='guoke'

[root@shell ~]# test -z '$char' && echo 1 || echo 0

0  #因?yàn)間uoke賦值給了char,所以也不是空值,輸出0

[root@shell ~]# char=''

[root@shell ~]# test -z '$char' && echo 1 || echo 0

1  #char為空值,所以長(zhǎng)度為0,表達(dá)式成立輸出1

#1.2.[]中括號(hào)條件測(cè)試語(yǔ)法和使用

#語(yǔ)法格式:[ <測(cè)試表達(dá)式> ]

#注意點(diǎn):中括號(hào)內(nèi)部的兩端都要有空格,[]和test用法一樣,test的判斷選項(xiàng)也可以在[]中用

#輸入兩端都有空格的技巧:先輸入一對(duì)中括號(hào),然后退一個(gè)格,輸入兩個(gè)空格,再退一個(gè)格

#例子:利用[]加-f選項(xiàng)(如果文件存在且為普通文件則表達(dá)式就成立)

[root@shell ~]# [ -f /tmp/guoke.txt ] && echo 1 || echo 00  #文件不存在所以輸出0

[root@shell ~]# touch /tmp/guoke.txt

[root@shell ~]# [ -f /tmp/guoke.txt ] && echo 1 || echo 0

1  #文件存在且為一個(gè)普通文件,則輸出1

[root@shell ~]# [ -f /tmp/guoke.txt ] && echo 1

1

#1.3.[[]] 雙中括號(hào)條件測(cè)試語(yǔ)法及使用

#語(yǔ)法格式:[[ <測(cè)試表達(dá)式> ]]

#注意點(diǎn):雙中括號(hào)的兩端需要有空格

#例子:判斷文件存在且為一個(gè)普通文件

[root@shell ~]# [[ -f /tmp/test.txt ]] && echo 1 || echo 00  #文件不存在所以條件不成立,輸出0

[root@shell ~]# touch /tmp/test.txt

[root@shell ~]# [[ -f /tmp/test.txt ]] && echo 1 || echo 0

1  #文件存在且為普通文件,條件成立,輸出1

[root@shell ~]# [[ -f /tmp/test.txt ]] && echo 1

1

#1.4.特殊條件測(cè)試表達(dá)式例子

#判斷條件測(cè)試表達(dá)式的條件成立或不成立后,還需要執(zhí)行多條命令語(yǔ)句的語(yǔ)法,不用if測(cè)試表達(dá)式的格式

#當(dāng)條件1成立時(shí),同時(shí)執(zhí)行多條命令

test 條件1 && {}[ 條件1 ] && {    命令1    命令2}[[ 條件1 ]] && {}

#例子:當(dāng)條件成立的時(shí)候就執(zhí)行后面的命令

[root@shell ~]# cat test.sh#!/bin/bash[ $1 -eq 3 ] && {echo 1echo 2echo 3}[root@shell ~]# sh test.sh 3 #傳參123

#上面的判斷相當(dāng)于下面if語(yǔ)句的效果

if [ 條件1 ];then 命令1 命令2fi

#關(guān)于條件測(cè)試表達(dá)式的總結(jié)

#1.test和[]、[[]]的功能有所重合,因此在工作中選擇一種適合自己的一種用,其他的可以看懂別人的寫的腳本就好了,可以同man test查看更多參數(shù)用法

#2.測(cè)試表達(dá)式test、[]、[[]]、(())區(qū)別總結(jié)

測(cè)試表達(dá)式符號(hào)            test             []             [[]]          (())邊界是否需要空格          需要              需要            需要         不需要邏輯操作符              !、-a、-o        !、-a、-o       !、&&、||     !、&&、||整數(shù)比較操作符            -eq -gt -lt -ge -le(test,[],[[]])          = < > >= <=字符串比較操作符           =、==、!= (全部支持)是否支持通配符匹配        不支持          不支持            支持         不支持

2.文件表達(dá)式

#常用的文件測(cè)試操作符

#常用操作符 #說(shuō)明-f 文件,全稱file #文件存在且為普通文件則為真,表達(dá)式成立-d 文件,全稱directory #文件存在且為目錄則為真,表達(dá)式成立-s 文件,全稱size #文件存在且大小不為0為真-e 文件,全稱exist #文件存在則為真-r 文件,全稱read #文件存在且為可讀則為真,表達(dá)式成立-w 文件,全稱write #文件存在且可寫為真,表達(dá)式成立-x 文件,全稱executable #文件存在且可執(zhí)行為真-L 文件,全稱link #文件存在且為鏈接文件為真f1 -nt f2,英文newer than #文件f1比文件f2新則為真,根據(jù)文件修改時(shí)間計(jì)算f1 -ot f2,英文older than #文件f1比文件f2舊為真,根據(jù)修改時(shí)間計(jì)算

#例子:#1.-f,判斷文件是否存在且為普通文件

[root@shell ~]# touch test

[root@shell ~]# ls -l test

-rw-r--r-- 1 root root 0 Mar 18 16:02 test

[root@shell ~]# [ -f test ] && echo 1 || echo 0

1 #解析:因?yàn)槲募嬖谇覟槠胀ㄎ募?,所以為真輸?

#2.-d,判斷文件是否存在且為目錄

[root@shell ~]# mkdir test1

[root@shell ~]# [ -d test1 ] && echo 1 || echo 0

1 #因?yàn)槲募嬖谇覟槟夸洠詾檎孑敵?,如果不存在就輸出0

#3.測(cè)試文件屬性:r,w,x

[root@shell ~]# ls -ld test

-rw-r--r-- 1 root root 0 Mar 18 16:02 test

[root@shell ~]# [ -r test ] && echo 1 || echo 0

1 #文件存在且可讀,為真,輸出1

[root@shell ~]# [ -w test ] && echo 1 || echo 0

1 #文件存在且可寫,為真,輸出1

[root@shell ~]# [ -x test ] && echo 1 || echo 0

0  #文件不可執(zhí)行,不為真,所以輸出0

[root@shell ~]# chmod +x test

[root@shell ~]# [ -x test ] && echo 1 || echo 0

1 #加了可執(zhí)行權(quán)限就為真成立了

#提示:測(cè)試文件的讀、寫、執(zhí)行等屬性,不光是根據(jù)文件屬性rwx的標(biāo)識(shí)來(lái)判斷,還要看當(dāng)前執(zhí)行測(cè)試的用戶是否真的可以按照對(duì)應(yīng)的權(quán)限操作該文件

#測(cè)試時(shí)變量的特殊寫法及問(wèn)題

#用[]測(cè)試變量時(shí),如果被測(cè)試的變量不加雙引號(hào),那么測(cè)試結(jié)果可能會(huì)是不正確的

#例子

[root@shell ~]# echo $test #不存在的變量[root@shell ~]# [ -f $test ] && echo 1 || echo 0 #不加引號(hào)返回的結(jié)果時(shí)錯(cuò)誤的1[root@shell ~]# [ -f '$test' ] && echo 1 || echo 0 #添加以后返回的結(jié)果是正確的0

#注意點(diǎn):做測(cè)試判斷時(shí),不一定非要按照前面的如果成立了輸出什么,不成立輸出什么,可以直接做部分判斷

[root@shell ~]# [ -x test ] && echo 1  #如果test文件可執(zhí)行,就輸出1,否則不做任何輸出[root@shell ~]# [ -f /etc ] || echo 0  #如果前面執(zhí)行失敗就輸出0,否則不做任何輸出0

3.字符串表達(dá)式

#字符串表達(dá)式作用:比較兩個(gè)字符串是否相同、測(cè)試字符串的長(zhǎng)度是否為0、字符串是否為null等

#常用的字符串測(cè)試操作符

#常用字符串操作符 #說(shuō)明-z '字符串' 如果字符串長(zhǎng)度為0則為真,-n '字符串' 如果字符串長(zhǎng)度不為0則為真,'字符串1' = '字符串2' 如果字符串1等于字符串2則為真,可以使用==代替='字符串1' != '字符串2' 如果字符串1不等于字符串2則為真,不能使用!==代替!=

#提示:

#1.上面的字符串測(cè)試操作符必須要有''引起來(lái)

#2.比較符號(hào)兩端要有空格

#3.-n 比較字符串長(zhǎng)度是否不為0,如果不為0則為真,用法 [ -n '$my' ]

#4.-z 比較字符串長(zhǎng)度是否為0,如果為0則為真,用法 [ -z '$my' ]

#例1:-n,-z參數(shù)應(yīng)用

[root@shell ~]# [ -n 'abc' ] && echo 1 || echo 01 #-n是不為空則為真,字符串長(zhǎng)度為abc,所以長(zhǎng)度不是為0,為真輸出1

[root@shell ~]# test -n 'aa' && echo 1 || echo 01 [root@shell ~]# test -n '' && echo 1 || echo 00 #字符串為空,不為真,數(shù)以輸出0

[root@shell ~]# var='test'[root@shell ~]# [ -n '$var' ] && echo 1|| echo 01[root@shell ~]# [ -z '$var' ] && echo 1|| echo 00 #-z是為空值為真,不為空值為假,所以輸出0

[root@shell ~]# [ 'aa' = 'aa' ] && echo 1 || echo 01 #字符串相等,所以長(zhǎng)度為0,為

#例二:進(jìn)行字符串比較時(shí),如果等號(hào)兩端沒(méi)有空格帶來(lái)的問(wèn)題

[root@shell ~]# [ 'abc'='1' ]&& echo 1 || echo 0 1     #等號(hào)兩邊沒(méi)有空格,明顯是不成立的也輸出了1
[root@shell ~]# [ 'abc' = '1' ]&& echo 1 || echo 0 0 #正?,F(xiàn)象

#總結(jié):字符串比較時(shí)若等號(hào)兩端沒(méi)有空格,則會(huì)導(dǎo)致判斷出現(xiàn)邏輯錯(cuò)誤,即使語(yǔ)句沒(méi)有問(wèn)題,但是結(jié)果依然可能不對(duì)

#例三:字符串不加引號(hào)可能帶來(lái)的問(wèn)題

[root@shell ~]# var=''    #將變量?jī)?nèi)容設(shè)置為空[root@shell ~]# [ -n '$var' ] && echo 1 || echo 00    #-n是值不為空則為真,因?yàn)樽兞績(jī)?nèi)容為0,為空值,所以不為真,輸出0
[root@shell ~]# [ -n $var ] && echo 1 || echo 01 #不加雙引號(hào)導(dǎo)致返回結(jié)果錯(cuò)誤[root@shell ~]# [ -z '$var' ]&& echo 1 || echo 01 #-z是字符串長(zhǎng)度為0,則為真

#查看有關(guān)雙引號(hào)和等號(hào)兩端空格的生產(chǎn)系統(tǒng)標(biāo)準(zhǔn)

[root@shell ~]# sed -n '30,31p' /etc/init.d/network# Check that networking is up.[ '${NETWORKING}' = 'no' ] && exit 6

4.整數(shù)表達(dá)式

#整數(shù)二元比較操作符

在test及[]中使用的比較符號(hào) 在[[]]和(())中使用的比較符號(hào) 說(shuō)明-eq == 或 = 相等,全稱equal-ne != 不相等,全稱not qeual-gt > 大于,全稱greater than-ge >= 大于等于,全稱為greater equal-lt < 小于,全稱less than-le <= 小于等于,全稱less equal

#注意:'<'和'>'在[]中括號(hào)里面需要轉(zhuǎn)義,對(duì)于數(shù)字不轉(zhuǎn)義的結(jié)果可能不會(huì)報(bào)錯(cuò),但是結(jié)果可能不對(duì),=和!=在[]不用轉(zhuǎn)義

#例子

[root@shell ~]# [ 2 > 3 ] && echo 1 || echo 01 #結(jié)果應(yīng)該返回0,但是不轉(zhuǎn)義返回了1是錯(cuò)誤的[root@shell ~]# [ 2 \> 3 ] && echo 1 || echo 00 #進(jìn)行轉(zhuǎn)義之后輸出正確[root@shell ~]# [ 2 < 1 ] && echo 1 || echo 01[root@shell ~]# [ 2 \< 1 ] && echo 1 || echo 00

#整數(shù)比較的推薦用法,使用-eq,-lt,-gt

#例子

[root@shell ~]# [ 13 -lt 24 ] && echo 1

1 #13小于24結(jié)果為真就輸出1

5.邏輯操作符

#常用的邏輯操作符

在test及[]中使用的比較符號(hào) 在[[]]和(())中使用的比較符號(hào) 說(shuō)明 -a && and,且,兩端都為真,則結(jié)果為真 -o || or,或,兩端有一個(gè)為真,則結(jié)果為真 ! ! not,非,兩端相反,則結(jié)果為真

#提示

1、邏輯操作符前后的表達(dá)式是否成立,一般用真假來(lái)表示2、“!”的中文意思是反,即與一個(gè)邏輯值相反的邏輯值3、-a的中文意思是“與”(and或&&),前后兩個(gè)邏輯值都為“真”,綜合返回值才為真,否則為假4、-o的中文意思是“或”(or或||),前后兩個(gè)邏輯值只要有一個(gè)為真,返回值就為真5、連接兩行[]、test或[[]]的表達(dá)式可用&&或||

#提示:中括號(hào)里面不能使用&&字符串,否則報(bào)錯(cuò),在[[]]和(())里面就可以用,可參考上面列出的

[root@shell ~]# [ -f '$f1' && -f '$f2' ] && echo 1 || echo 0-bash: [: missing `]'0

#例一:

[root@shell ~]# f1=/etc/rc.local[root@shell ~]# f2=/etc/services[root@shell ~]# [ -f '$f1' -a -f '$f2' ] && echo 1 || echo 01  #判斷如果f1和f2變量的文件存在且為文件的話,就為真,輸出1,如果一個(gè)不為真,那么久不為真,就輸出0

[root@shell ~]# [[ -f '$f1' && -f '$f2' ]] && echo 1 || echo 0

1  #在[[]]雙中括號(hào)中就可以使用&&

[root@shell ~]# [ -f '$f1' ]&&[ -f '$f2' ] && echo 1 || echo 0

1  #或者在兩個(gè)[]之間使用&&也可以

#例二:

[root@shell ~]# a=1[root@shell ~]# b=2[root@shell ~]# [ '$a' -eq 2 -a '$b' -eq 2 ] && echo 1 || echo 00 #如果變量a等于2且變量b也等于2,則為真,否則為假,輸出0

[root@shell ~]# [ '$a' -eq 1 -a '$b' -eq 2 ] && echo 1 || echo 01[root@shell ~]# [ '$a' -eq 1 -o '$b' -eq 2 ] && echo 1 || echo 01 #如果變量a等于或變量b等于2,則為真,輸出1,-o是或,有一個(gè)條件成立則為真

[root@shell ~]# [ '$a' -eq 2 -o '$b' -eq 3 ] && echo 1 || echo 00

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多