Linux shell 中一些符號(hào)$() ` `敢课,${},$[] $(())绷杜,[ ] (( )) [[ ]]區(qū)分

Shell中經(jīng)常遇到一些符號(hào)容易混淆直秆,今天一起總結(jié)學(xué)習(xí)下加深理解。

1. $()``

$()`` (反引號(hào)) 都是用來(lái)做命令替換用的鞭盟。
我們直接看例子:

=> echo 5加4等于:$(expr 5 + 4)
5加4等于:9
=> echo 5加4等于:`expr 5 + 4`
5加4等于:9

在操作上圾结,這兩者都是達(dá)到相同的效果,但是建議使用$()齿诉,理由如下:
在多層次的復(fù)合替換中筝野,`` 必須要轉(zhuǎn)義處理(反斜線),而$()比較直觀粤剧。如下例子(只是為了說(shuō)明多層次命令歇竟,不用介意具體運(yùn)算):

=> echo 5加4加1等于:$(expr $(expr 5 + 4 ) + 1)
5加4加1等于:10
=> echo 5加4加1等于:`expr \`expr 5 + 4\` + 1`
5加4加1等于:10
2. ${} :變量替換

${}用于變量替換。一般情況下抵恋,$var${var} 結(jié)果差不多焕议。但是用 ${}會(huì)精確的界定變量名稱的范圍。例子:

=> file="test";echo $file_txt
#空值弧关,因?yàn)闆](méi)有定義file_txt
=> file="test";echo ${file}_txt
test_txt

${}的一些其他功能:

1)${}信息提取

主要有以下四種, 此部分內(nèi)容參考學(xué)習(xí)(Linux shell 之 提取文件名和目錄名的一些方法):
我們以var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz為例說(shuō)明
A. ${var##*.}:該命令的作用是去掉變量var從左邊算起的最后一個(gè)'.'字符及其左邊的內(nèi)容盅安,返回從左邊算起的最后一個(gè)'.'(不含該字符)的右邊的內(nèi)容。結(jié)果如下:

=> var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz
=> echo ${var##*.}
gz

因此使用該命令世囊,可以提取出我們需要的文件后綴别瞭。

B、${var#*.}: 該命令的作用是去掉變量var從左邊算起的第一個(gè)'.'字符及其左邊的內(nèi)容株憾,返回從左邊算起第一個(gè)'.'(不含該字符)的右邊部分的內(nèi)容畜隶。例子結(jié)果如下:

=> var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz
=> echo ${var#*.}
fq.gz

使用該命令,可以提取出文件的多個(gè)后綴号胚。

C籽慢、${var%/*}: 該命令的使用是去掉變量var從右邊算起的第一個(gè)'/'字符及其右邊的內(nèi)容,返回從右邊算起的第一個(gè)'/'(不含該字符)的左邊的內(nèi)容猫胁。例子結(jié)果如下:

=> var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz
=> echo ${var%/*}
/home/test/dir1/dir2

從結(jié)果可看出箱亿,使用該命令,可以提取出需要的文件所在的目錄弃秆。

D届惋、${var%%.*}: 該命令的使用是去掉變量var從右邊算起的最后一個(gè)'.'字符及其右邊的內(nèi)容髓帽,返回從右邊算起的最后一個(gè)'.'(不含該字符)的左邊的內(nèi)容。使用例子及結(jié)果如下:

=> var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz
=> echo ${var%%.*}
/home/test/dir1/dir2/V3_L01_99_2

使用該命令脑豹,可以提取出需要的文件除去多個(gè)后綴后的路徑與文件名郑藏。
從這也可發(fā)現(xiàn)一些規(guī)律,即:
#:表示從左邊算起第一個(gè)
##:表示從左邊算起最后一個(gè)
%:表示從右邊算起第一個(gè)
%%:表示從右邊算起最后一個(gè)

當(dāng)然上述操作的作用并不只是為了提取文件名或后綴瘩欺,只是為了說(shuō)明${}在信息提取上的應(yīng)用必盖;shell中文件名或后綴的提取可直接使用basename和dirname,還是以上述為例:
=> var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz
=> echo $(basename $var)
V3_L01_99_2.fq.gz
=> echo $(basename $var .fq.gz)
V3_L01_99_2
=> echo $(dirname $var)
/home/test/dir1/dir2
2)${} substring 按字符位置俱饿、長(zhǎng)度截取

格式:${var:offset:length},取得字符串的子字符串
直接看例子:

var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz
echo ${var:0:5} #從頭開始歌粥,提取最左邊的 5 個(gè)字節(jié),結(jié)果:/home
echo ${var:5}   #從提取第 5 個(gè)字節(jié)右邊到結(jié)尾的字符拍埠,結(jié)果:/test/dir1/dir2/V3_L01_99_2.fq.gz
echo ${var:5:5} #提取第 5 個(gè)字節(jié)右邊的連續(xù) 5 個(gè)字節(jié)失驶,結(jié)果;/test
echo ${#var}    #計(jì)算出字符串的長(zhǎng)度枣购,結(jié)果:38
echo ${var: -5} #注意區(qū)分嬉探,中間有空格,提取最后五個(gè)字符棉圈,結(jié)果:fq.gz
echo ${var:-5}  #結(jié)果:/home/test/dir1/dir2/V3_L01_99_2.fq.gz,為啥值等于$var涩堤,下面部分有解釋
echo ${var:(-5)} #注意上面三者的區(qū)分,結(jié)果:fq.gz

3)${} 查找替換和刪除

此部分參考學(xué)習(xí):bash字符串處理

  • 查找替換:
    ${var/pattern/replacement}:查找var變量存儲(chǔ)的字符中第一次由pattern匹配到的內(nèi)容迄损,并替換為replacement定躏;
    ${var//pattern/replacement}:查找var變量存儲(chǔ)的字符中所有能夠由pattern匹配到的內(nèi)容,并替換為replacement芹敌;
    例子:
=> var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz;echo ${var/dir/path}
/home/test/path1/dir2/V3_L01_99_2.fq.gz
=> var=/home/test/dir1/dir2/V3_L01_99_2.fq.gz;echo ${var//dir/path}
/home/test/path1/path2/V3_L01_99_2.fq.gz
  • 查找刪除:

${var/pattern}:查找var變量存儲(chǔ)的字符中第一次由pattern匹配到的內(nèi)容痊远,并刪除;
${var//pattern}:查找var變量存儲(chǔ)的字符中所有能夠由pattern匹配到的內(nèi)容氏捞,并刪除碧聪;
${var/#pattern}:查找var變量存儲(chǔ)的字符中最開始處能夠由pattern匹配到的內(nèi)容,并刪除液茎;
${var/%pattern}:查找var變量存儲(chǔ)的字符中最后位置能夠由pattern匹配到的內(nèi)容逞姿,并刪除;
例子如下:

=> var=home/test/dir1/home2/dir2/home;echo ${var/home}
/test/dir1/home2/dir2/home
=> var=home/test/dir1/home2/dir2/home;echo ${var//home}
/test/dir1/2/dir2/
=> var=home/test/dir1/home2/dir2/home;echo ${var/#home}
/test/dir1/home2/dir2/home
=> var=home/test/dir1/home2/dir2/home;echo ${var/%home}
home/test/dir1/home2/dir2/
4)${} 大小寫替換

^替換為大寫捆等,^^統(tǒng)統(tǒng)替換為大寫
,替換為小寫滞造,,,統(tǒng)統(tǒng)替換為小寫

var="home/test/dir1/dir2/V3_L01_99_2.fq.gz"
echo ${var^} # Home/test/dir1/dir2/V3_L01_99_2.fq.gz
echo ${var^^} # HOME/TEST/DIR1/DIR2/V3_L01_99_2.FQ.GZ
echo ${var,} # home/test/dir1/dir2/V3_L01_99_2.fq.gz
echo ${var,,} # home/test/dir1/dir2/v3_l01_99_2.fq.gz
5)利用 ${} 還可針對(duì)不同的變量狀態(tài)賦值(初始化、空值栋烤、非空值)

本部分參考學(xué)習(xí)https://blog.csdn.net/x1269778817/article/details/46535729

變量設(shè)定

這也是上部分${var:-5} 結(jié)果為啥還是等于$var的原因谒养。

6) ${} 數(shù)組與關(guān)聯(lián)數(shù)組

shell中的數(shù)組與關(guān)聯(lián)數(shù)組
聲明數(shù)組: declare -a array
聲明關(guān)聯(lián)數(shù)組: declare -A MAP

declare -a ARY     #聲明數(shù)組
declare -A MAP    #聲明關(guān)聯(lián)數(shù)組
MAP=([a]=1 [b]=2 [cde]=3 [f]=F)     #關(guān)聯(lián)數(shù)組MAP
ARY=(a b cde f)                              #數(shù)組ARY

echo ${ARY[2]}                               #數(shù)組ARY,從0開始明郭,因此是第三個(gè)元素买窟,cde
echo ${#ARY[2]}                             #數(shù)組ARY丰泊,第三個(gè)元素的長(zhǎng)度, 3
echo ${ARY[@]}                             #數(shù)組所有元素, a b cde f
echo ${ARY[*]}                                #數(shù)組所有元素, a b cde f
echo ${#ARY[@]}                            #數(shù)組大小, 4
echo ${ARY[@]:0:2}                        #數(shù)組從頭開始前兩個(gè)元素,a b
echo ${ARY[@]: -2:2}                      #注意-2前面有空格始绍,原因上面講過(guò)瞳购,從最后一個(gè)元素-1開始向左數(shù)2個(gè)元素,cde f
echo ${MAP[@]}                              #關(guān)聯(lián)數(shù)組所有值亏推,1 3 2 F
echo ${#MAP[@]}                           #關(guān)聯(lián)數(shù)組大小学赛,4
echo ${MAP[cde]}                           #關(guān)聯(lián)數(shù)組cde的值,3
echo ${!MAP[@]}                             #返回索引径簿,a cde b f

3. $[]$(())

進(jìn)行數(shù)學(xué)運(yùn)算罢屈。支持+ - * / %:分別為 “加嘀韧、減篇亭、乘、除锄贷、求余"译蒂,如下:

a=10;b=8;c=5;
echo $a + $b          #輸出:10 + 8
echo $(( a + b*c))    #輸出:50
echo $(((a*b)/c))      #輸出:16

#在 $(( )) 中的變量名稱,其前面可以加 $ 符號(hào)谊却,也可以不用柔昼,如:

echo $(( $a + $b * $c)) # 輸出也是 50

$[]$(()) 的過(guò)去形式,現(xiàn)在已經(jīng)不建議使用

4. []

即為test命令的另一種形式炎辨。

但要注意:

1).必須在左括號(hào)的右側(cè)和右括號(hào)的左側(cè)各加一個(gè)空格捕透,否則會(huì)報(bào)錯(cuò)。

2).test命令使用標(biāo)準(zhǔn)的數(shù)學(xué)比較符號(hào)來(lái)表示字符串的比較碴萧,而用文本符號(hào)來(lái)表示數(shù)值的比較乙嘀。

3).字符比較的大于符號(hào)或小于符號(hào)必須要轉(zhuǎn)義,否則會(huì)被理解成重定向破喻。

4). []中的邏輯與和邏輯或使用-a 和-o 表示
例子:

num=10
str1=abc
#字符串
if [ $str1 = "abc" ];then
  echo "this is $str1"
fi
# 輸出:this is abc
# 數(shù)字
if [ $num -gt 1 -a $num -lt 20 ];then
  echo "this is $num"
fi
# 輸出:this is 10
if [ $num -gt 1 ] && [ $num -lt 20 ];then
  echo "this is $num"
fi
# 輸出:this is 10

[]條件判斷的一些總結(jié)虎谢,此部分參考來(lái)源全網(wǎng)最全的 bash 速查表 ;

statement1 && statement2  # and 操作符
statement1 || statement2  # or 操作符

exp1 -a exp2              # exp1 和 exp2 同時(shí)為真時(shí)返回真(POSIX XSI擴(kuò)展)
exp1 -o exp2              # exp1 和 exp2 有一個(gè)為真就返回真(POSIX XSI擴(kuò)展)
( expression )            # 如果 expression 為真時(shí)返回真,輸入注意括號(hào)前反斜桿
! expression              # 如果 expression 為假那返回真

str1 = str2               # 判斷字符串相等曹质,如 [ "$x" = "$y" ] && echo yes
str1 != str2              # 判斷字符串不等婴噩,如 [ "$x" != "$y" ] && echo yes
str1 < str2               # 字符串小于,如 [ "$x" \< "$y" ] && echo yes
str2 > str2               # 字符串大于羽德,注意 < 或 > 是字面量几莽,輸入時(shí)要加反斜桿
-n str1                   # 判斷字符串不為空(長(zhǎng)度大于零)
-z str1                   # 判斷字符串為空(長(zhǎng)度等于零)

-a file                   # 判斷文件存在,如 [ -a /tmp/abc ] && echo "exists"
-d file                   # 判斷文件存在宅静,且該文件是一個(gè)目錄
-e file                   # 判斷文件存在章蚣,和 -a 等價(jià)
-f file                   # 判斷文件存在,且該文件是一個(gè)普通文件(非目錄等)
-r file                   # 判斷文件存在坏为,且可讀
-s file                   # 判斷文件存在究驴,且尺寸大于0
-w file                   # 判斷文件存在镊绪,且可寫
-x file                   # 判斷文件存在,且執(zhí)行
-N file                   # 文件上次修改過(guò)后還沒(méi)有讀取過(guò)
-O file                   # 文件存在且屬于當(dāng)前用戶
-G file                   # 文件存在且匹配你的用戶組
file1 -nt file2           # 文件1 比 文件2 新
file1 -ot file2           # 文件1 比 文件2 舊

num1 -eq num2             # 數(shù)字判斷:num1 == num2
num1 -ne num2             # 數(shù)字判斷:num1 != num2
num1 -lt num2             # 數(shù)字判斷:num1 < num2
num1 -le num2             # 數(shù)字判斷:num1 <= num2
num1 -gt num2             # 數(shù)字判斷:num1 > num2
num1 -ge num2             # 數(shù)字判斷:num1 >= num2
5. (())[[]]

(())[[]]分別是針對(duì)數(shù)學(xué)比較表達(dá)式字符串表達(dá)式的加強(qiáng)版洒忧。
可參考:Bash test and comparison functions

  1. [[ ]] 結(jié)構(gòu)比[ ]結(jié)構(gòu)更加通用
  2. [[ ]]支持字符串的模式匹配蝴韭,使用=~操作符時(shí)甚至支持shell的正則表達(dá)式。
    繼續(xù)上面例子:
num=10
str1=abc

if [[ $num -gt 1 && $num -lt 20 ]];then
  echo "this is $num"
fi
# 輸出:this is 10熙侍,注意寫成[ $num -gt 1 && $num -lt 20 ]會(huì)出錯(cuò)榄鉴;
if [[ $str1 =~ ab ]];then
  echo "this is $str1"
fi
# 輸出:this is abc

(( ))相比(),不需要再將表達(dá)式里面的大小于符號(hào)轉(zhuǎn)義蛉抓,除了可以使用標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算符外庆尘,還增加了自增自減等符號(hào);如

for ((i = 0; i < 10; i++)); do echo $i; done
# 輸出0-9的數(shù)

其他功能巷送,如{n..m} 代表n-m之間的數(shù)字驶忌,如{0..4}$(seq 0 4)表示相同意思。/{,s}bin/表示/bin/和/sbin/笑跛,ab{c,d,e}表示abc付魔、abd、abe飞蹂,如實(shí)現(xiàn)文件的快速備份:cp run.sh{,.bak}几苍。
當(dāng)然隨時(shí)可查看bash 速查表

有參考Shell 參數(shù)擴(kuò)展及各類括號(hào)在 Shell 編程中的應(yīng)用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陈哑,隨后出現(xiàn)的幾起案子妻坝,更是在濱河造成了極大的恐慌,老刑警劉巖惊窖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刽宪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爬坑,警方通過(guò)查閱死者的電腦和手機(jī)纠屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盾计,“玉大人售担,你說(shuō)我怎么就攤上這事∈鸹裕” “怎么了族铆?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哭尝。 經(jīng)常有香客問(wèn)我哥攘,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任逝淹,我火速辦了婚禮耕姊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栅葡。我一直安慰自己茉兰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布欣簇。 她就那樣靜靜地躺著规脸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熊咽。 梳的紋絲不亂的頭發(fā)上莫鸭,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音横殴,去河邊找鬼被因。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滥玷,可吹牛的內(nèi)容都是我干的氏身。 我是一名探鬼主播巍棱,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惑畴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了航徙?” 一聲冷哼從身側(cè)響起如贷,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎到踏,沒(méi)想到半個(gè)月后杠袱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窝稿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年楣富,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伴榔。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纹蝴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出踪少,到底是詐尸還是另有隱情塘安,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布援奢,位于F島的核電站兼犯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜切黔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一砸脊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纬霞,春花似錦脓规、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绢陌,卻和暖如春挨下,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脐湾。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工臭笆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秤掌。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓愁铺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親闻鉴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茵乱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容