溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Shell中命令替換的示例分析

發(fā)布時(shí)間:2021-10-23 17:41:22 來(lái)源:億速云 閱讀:195 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章主要為大家展示了“Shell中命令替換的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Shell中命令替換的示例分析”這篇文章吧。

什么是命令替換

簡(jiǎn)單的來(lái)說(shuō)就是在 SHELL 內(nèi)嵌套多條命令,一次性執(zhí)行得到結(jié)果。

1、一層 SHELL 嵌套
# echo `whoami`# echo $(whoami) # echo "hello,`whoami`"# echo "hello,$(whoami)"

Shell中命令替換的示例分析

2、二層 SHELL 嵌套
# echo `cat ./gn2.txt` | sed -s "s;$; --list;"

使用 ``讀取文件內(nèi)容,再使用管道符二次處理后。執(zhí)行!

注意:這里已經(jīng)用了一層嵌套,以下多個(gè)小節(jié)會(huì)套用以實(shí)現(xiàn)二層嵌套。

a. 使用 "$()" 進(jìn)行二層嵌套

Shell中命令替換的示例分析

b. 使用 "|" 進(jìn)行命令導(dǎo)向

Shell中命令替換的示例分析

c. 注意事項(xiàng)以及解答一些疑問(wèn)

可能有讀者已經(jīng)注意到了,之前在簡(jiǎn)單 SHELL 一層嵌套中說(shuō)了嵌套還有另一種。那為什么不使用 ` ` 進(jìn)行嵌套。

  • 根本的原因是:` ` 不支持命令嵌套執(zhí)行!

    • 強(qiáng)制執(zhí)行。也只能認(rèn)出***組,其余按照空格作為間隔各個(gè)執(zhí)行 或 按照管道符(含)直到末尾執(zhí)行。

  • 比較陳舊。容易與“單引號(hào)”混淆。

    • 它是美式鍵盤左上角 ESC 下面的包含 ~ 的反引號(hào)鍵!

  • 已有替代品。$(...) 格式受到POSIX標(biāo)準(zhǔn)支持,也利于嵌套。

    • $() 可以多層嵌套類似 $($($())) ,但如果內(nèi)部有一個(gè)` ` 也是可以執(zhí)行的喲(出于兼容考慮)!

3、進(jìn)階

之前我們介紹了 ``$(...) ,這倆種命令執(zhí)行。

想來(lái)現(xiàn)在你一定對(duì)命令執(zhí)行有比較深的理解了?,F(xiàn)在,我們需要再進(jìn)階一下~

1、 (cmd){var}

關(guān)于 ( ){ },和 命令替換 一樣都是 shell 擴(kuò)展 父類下的相關(guān)概念。

提示:{} 頭部大括號(hào)右側(cè)必須有一個(gè)空格,尾部括號(hào)左側(cè)必須有分號(hào)結(jié)尾。

# ( echo firest;echo second; )# { echo third;echo fourth; }

Shell中命令替換的示例分析

注意: ( ) 只是對(duì)一串命令重新開(kāi)一個(gè) 子 shell 進(jìn)行執(zhí)行, { } 對(duì)一串命令在 當(dāng)前 shell 執(zhí)行。

2、(){} 造成的影響

a. () 括號(hào)內(nèi)的語(yǔ)句影響在括號(hào)內(nèi)

# var=source# ( echo $var;var=global;echo $var; )# echo $var

Shell中命令替換的示例分析

b. {} 括號(hào)內(nèi)的語(yǔ)句影響到全局。

# echo $var# { echo $var;var=global;echo $var; }# echo $var

Shell中命令替換的示例分析

注意:{} 改變 var 的變量以后,外部也受到了影響。

什么是參數(shù)擴(kuò)展

參數(shù)擴(kuò)展的基本格式是 ${ parameter },擴(kuò)展的結(jié)果是 ${ parameter }被替換為相應(yīng)的值。

1、實(shí)例一
echo $1 $11echo $1 ${11}

Shell中命令替換的示例分析

首先解釋下 ${1..9} 是什么意思。在我們寫 Shell 時(shí)必不可免的需要傳遞參數(shù)以實(shí)現(xiàn)自定義變量。當(dāng)超過(guò)阿拉伯?dāng)?shù)字 9 以后。就需要使用 ${ parameter } 明確告訴Shell11 個(gè)參數(shù)是 ${11}。

提示:上圖顯示 101 就是因?yàn)?$11 不滿足 [1-9]{1} 。系統(tǒng)將 11 拆分成 $11 ,所以運(yùn)算后結(jié)果是 101。

2、實(shí)例二
ban=banecho a $bananaecho a ${ban}ana

Shell中命令替換的示例分析

這個(gè)實(shí)例中,我想輸出 banana 。已經(jīng)定義了一個(gè) ban 的變量為 ban ,只要加上 ana 就可以成為 “笨啦啦”。

但是很顯然的不加 {} 是無(wú)法做到使變量 $ban 配合 ana 顯示出 banana 的!

什么是變量擴(kuò)展

從官方定義上來(lái)說(shuō),我并不應(yīng)該將 “變量擴(kuò)展” 無(wú)中生有出來(lái)。

" $ 字符引入?yún)?shù)擴(kuò)展,命令替換或算術(shù)擴(kuò)展。" —— 官方手冊(cè)

主要是出于倆個(gè)方面考慮:

  • 多數(shù)接受。國(guó)內(nèi)出現(xiàn)了大量 ”變量擴(kuò)展“ 的文章,多數(shù)人已經(jīng)接受這個(gè)名稱。

  • 便于理解。參數(shù)就是 ${...} 括號(hào)內(nèi)的東西,而變量一詞可表示所有操作圍繞變量展開(kāi)。

  • 便于記錄。切分以后,對(duì)寫這篇文章的排版有幫助。亦可以從基礎(chǔ)、中級(jí)、高級(jí)有一定水平劃分。

實(shí)例:

var='This is one test sentence.'var1=parametervar2=word

現(xiàn)在我們有了這樣的一個(gè)句子,我希望做一些判斷、摘?。ɑ蛘哒f(shuō):切片)或修改。我該如何操作?

1、變量替換

a. ${parameter:-word}

# echo ${var1:-$var2}parameter# var1=# echo ${var1:-$var2}word

如果 var1 未設(shè)置或?yàn)榭?,則替換成 var2

b. ${parameter:=word}

同上。位置參數(shù)和特殊參數(shù)不能以這種方式分配。

c. ${parameter:?word}

# var1=# echo ${var1:?var2}bash: var1: var2# echo $?1

當(dāng)變量 var1 未設(shè)置或?yàn)榭?,shell 也是可交互時(shí),進(jìn)行報(bào)錯(cuò)并且退出。如果 shell 不可交互,則發(fā)生變量替換。

d. ${parameter:+word}

# echo $var1parameter# echo $var2word# echo ${var1:+$var2}word# echo $var1parameter

如果 var1 為空或未設(shè)置,那么就什么都不做。不然使用 var2 進(jìn)行替換。

提示: 在我測(cè)試的時(shí)候,我發(fā)現(xiàn)并不是全局生效的。

2、變量切片

a. 范圍切片(同方向)

# echo ${var:8:17}one test sentence

注意:倆個(gè)數(shù)字都是從頭開(kāi)始數(shù)的。

b. 范圍切片(非同向)

# echo ${var:8:-1}one test sentence# echo ${var:8:(-1)}one test sentence

提示:倆種寫法都是正確的。

c. 切片位置

# a='This is one'# echo ${#a}11

提示 :首先建立變量 a='This is one' ,然后使用 echo ${#a} 將字符數(shù)量讀了出來(lái)。

3、變量修改

a. 簡(jiǎn)單修改

# echo ${var}This is one test sentence.# echo ${var/one/a}This is a test sentence.

提示:個(gè)人認(rèn)為這種是***的方式了,可以范圍式修改(包含刪除)。

b. 簡(jiǎn)單刪除

# echo ${var%sentence.}This is one test
# echo ${var#This is}one test sentence.

c. 附:表格

< 如顯示不全,請(qǐng)左右滑動(dòng) >
變量設(shè)置方式說(shuō)明
${變量#關(guān)鍵字}若變量?jī)?nèi)容從開(kāi)始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最數(shù)據(jù)刪除
${變量##關(guān)鍵字}若變量?jī)?nèi)容從開(kāi)始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最長(zhǎng)數(shù)據(jù)刪除
${變量%關(guān)鍵字}若變量?jī)?nèi)容從開(kāi)始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最數(shù)據(jù)刪除
${變量%%關(guān)鍵字}若變量?jī)?nèi)容從開(kāi)始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最長(zhǎng)數(shù)據(jù)刪除
${變量/舊字符串/新字符串}若變量?jī)?nèi)容符合“舊字符串”,則***舊字符會(huì)被新字符替換
${變量/舊字符串//新字符串}若變量?jī)?nèi)容符合“舊字符串”,則全部舊字符會(huì)被新字符替換

以上是“Shell中命令替換的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI