自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Shell中的命令替換及參數(shù)擴展

系統(tǒng) Linux
人工智能選中的 Python 勢必鋒不可當(dāng),經(jīng)典的 Shell 也相當(dāng)精妙絕倫。今天和大家分享的主要是 “命令替換” 以及 “參數(shù)擴展” 。

 

 

 

[[214405]]

前言

其實,你現(xiàn)在閱讀到的是第三版的文章(幾乎全部重構(gòu))。記得我寫***版的時候,還是一名 “參賽選手”。后來比賽失利便和朋友一起做 IDC 創(chuàng)業(yè)。第二次改的時候,是我發(fā)現(xiàn)閱讀量在倆三個月內(nèi)直接自己站點 top 到***,加上參與了開源社區(qū),維護了 LCTT-CLI 項目。***第三次也就是這次,是因為通過了 RHCE 模擬考加上一年多積累。所以這次的內(nèi)容或是排版都應(yīng)是最棒!BTW:這篇文章在我的博客IT兄弟盟,依舊是***的閱讀量!

一開始寫這篇文章是因為兼職創(chuàng)業(yè) IDC 公司運維,需要一點 shell script 來實現(xiàn)某些需求。雖然現(xiàn)在已經(jīng)是 Python 的時代了。插個話題,我怎么理解 Python 和 Shell 呢?拿游泳來做個比喻:前者是正規(guī)游泳館,有正規(guī)教練輔助相伴;后者是鄉(xiāng)下小湖泊,麻雀雖小五臟俱全。人工智能選中的 Python 勢必鋒不可當(dāng),經(jīng)典的 Shell 也相當(dāng)精妙絕倫。比如以前我寫 Shell 的時候用了很多 if else 語句、 case 語句,有 test 語句,懂得 || && ; 輔助,這是最小白的。后面學(xué)習(xí)了很多比較運算符,但多數(shù)還是在積累命令數(shù)量以及條件語句。再到現(xiàn)在,我開始去思考命令和命令之間存在的關(guān)系、語句分隔符的意義、BASH 控制結(jié)構(gòu)等等。

所以今天和大家分享的主要是 “命令替換” 以及 “參數(shù)擴展” 。

 

什么是命令替換

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

 

1、一層 SHELL 嵌套

  1. # echo `whoami`
  2. # echo $(whoami)
  3.  
  4. # echo "hello,`whoami`"
  5. # echo "hello,$(whoami)"

 

2、二層 SHELL 嵌套

  1. # echo `cat ./gn2.txt` | sed -s "s;$; --list;"

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

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

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

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

c. 注意事項以及解答一些疑問

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

  • 根本的原因是:` ` 不支持命令嵌套執(zhí)行!
    • 強制執(zhí)行。也只能認出***組,其余按照空格作為間隔各個執(zhí)行 或 按照管道符(含)直到末尾執(zhí)行。
  • 比較陳舊。容易與“單引號”混淆。
    • 它是美式鍵盤左上角 ESC 下面的包含 ~ 的反引號鍵!
  • 已有替代品。$(...) 格式受到POSIX標(biāo)準(zhǔn)支持,也利于嵌套。
    • $() 可以多層嵌套類似 $($($())) ,但如果內(nèi)部有一個` ` 也是可以執(zhí)行的喲(出于兼容考慮)!

 

3、進階

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

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

1、 (cmd){var}

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

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

  1. # ( echo firest;echo second; )
  2. # { echo third;echo fourth; }

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

2、(){} 造成的影響

a. () 括號內(nèi)的語句影響在括號內(nèi)

  1. # var=source
  2. # ( echo $var;var=global;echo $var; )
  3. # echo $var

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

  1. # echo $var
  2. # { echo $var;var=global;echo $var; }
  3. # echo $var

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

 

什么是參數(shù)擴展

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

 

1、實例一

  1. echo $1 $11
  2. echo $1 ${11}

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

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

 

2、實例二

  1. ban=ban
  2. echo a $banana
  3. echo a ${ban}ana

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

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

 

什么是變量擴展

從官方定義上來說,我并不應(yīng)該將 “變量擴展” 無中生有出來。

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

主要是出于倆個方面考慮:

  • 多數(shù)接受。國內(nèi)出現(xiàn)了大量 ”變量擴展“ 的文章,多數(shù)人已經(jīng)接受這個名稱。
  • 便于理解。參數(shù)就是 ${...} 括號內(nèi)的東西,而變量一詞可表示所有操作圍繞變量展開。
  • 便于記錄。切分以后,對寫這篇文章的排版有幫助。亦可以從基礎(chǔ)、中級、高級有一定水平劃分。

實例:

  1. var='This is one test sentence.'
  2. var1=parameter
  3. var2=word

現(xiàn)在我們有了這樣的一個句子,我希望做一些判斷、摘取(或者說:切片)或修改。我該如何操作?

 

1、變量替換

a. ${parameter:-word}

  1. # echo ${var1:-$var2}
  2. parameter
  3. # var1=
  4. # echo ${var1:-$var2}
  5. word

如果 var1 未設(shè)置或為空,則替換成 var2。

b. ${parameter:=word}

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

c. ${parameter:?word}

  1. # var1=
  2. # echo ${var1:?var2}
  3. bash: var1: var2
  4. # echo $?
  5. 1

當(dāng)變量 var1 未設(shè)置或為空,shell 也是可交互時,進行報錯并且退出。如果 shell 不可交互,則發(fā)生變量替換。

d. ${parameter:+word}

  1. # echo $var1
  2. parameter
  3. # echo $var2
  4. word
  5. # echo ${var1:+$var2}
  6. word
  7. # echo $var1
  8. parameter

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

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

 

2、變量切片

a. 范圍切片(同方向)

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

注意:倆個數(shù)字都是從頭開始數(shù)的。

b. 范圍切片(非同向)

  1. # echo ${var:8:-1}
  2. one test sentence
  3. # echo ${var:8:(-1)}
  4. one test sentence

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

c. 切片位置

  1. # a='This is one'
  2. # echo ${#a}
  3. 11

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

 

3、變量修改

a. 簡單修改

  1. # echo ${var}
  2. This is one test sentence.
  3. # echo ${var/one/a}
  4. This is a test sentence.

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

b. 簡單刪除

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

c. 附:表格

 

 

< 如顯示不全,請左右滑動 >
變量設(shè)置方式 說明
${變量#關(guān)鍵字} 若變量內(nèi)容從開始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最數(shù)據(jù)刪除
${變量##關(guān)鍵字} 若變量內(nèi)容從開始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最數(shù)據(jù)刪除
${變量%關(guān)鍵字} 若變量內(nèi)容從開始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最數(shù)據(jù)刪除
${變量%%關(guān)鍵字} 若變量內(nèi)容從開始的數(shù)據(jù)符合“關(guān)鍵字”,則將符合的最數(shù)據(jù)刪除
${變量/舊字符串/新字符串} 若變量內(nèi)容符合“舊字符串”,則***舊字符會被新字符替換。
${變量/舊字符串//新字符串} 若變量內(nèi)容符合“舊字符串”,則全部舊字符會被新字符替換

 

 

更深入學(xué)習(xí),探索資料

 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2009-08-11 10:34:41

linux中du命令參linux命令行參數(shù)linux命令行

2010-06-23 16:09:40

Linux Bash

2011-10-27 10:30:55

CISCO配置命令

2017-03-08 11:10:39

LinuxShell命令

2011-03-15 09:59:57

2009-08-16 20:11:50

linux中talk命talk命令參數(shù)linux命令行參數(shù)

2023-12-25 22:19:35

函數(shù)

2016-09-27 10:05:11

LinuxShell命令

2013-06-03 11:28:05

shell命令

2011-03-15 09:02:01

IPtables常用命令

2009-08-11 10:45:58

linux中du命令參linux命令行參數(shù)linux命令行

2009-08-16 19:46:16

linux中ftp命令ftp命令參數(shù)linux命令行參數(shù)

2009-08-16 19:53:43

ftp服務(wù)器linux中ftp命令ftp命令參數(shù)

2009-08-16 20:02:27

linux中dir命令dir命令參數(shù)linux命令行參數(shù)

2009-08-16 19:43:07

linux中touchtouch命令linux命令行參數(shù)

2017-03-23 14:18:30

LinuxShell命令

2022-05-09 08:55:58

Linuxdiff命令

2009-08-16 20:08:28

linux中w命令參數(shù)w命令參數(shù)linux命令行參數(shù)

2021-05-12 10:17:15

Shell工具Linux

2025-01-20 07:00:00

點贊
收藏

51CTO技術(shù)棧公眾號