shell的命令替換和命令組合

2022-02-20 11:02:58 字數 1468 閱讀 2550

bash&shell系列文章:

linux中使用反引號"``"(在波浪線的按鍵上)或者$()來執行命令替換。使用括號()來組合一系列命令。

[root@xuexi ~]# echo what date it is? $(date +%f)

what

date it is? 2016-09-25

[root@xuexi tmp]#

echo what date it is? `date +%f` # 或者使用反引號

注:反引號和$()基本幾乎等價,但盡量使用$()。反引號有兩點不方便之處:(1)命令替換巢狀或者是包含引號的時候,反引號很麻煩,不如$()易讀。(2)反引號處理反斜線的轉義規則比較不明確,但是$()中的反斜線會按正常的方式轉義。參見

使用$()可以讓括號裡的命令提前於整個命令執行,然後將執行結果插入在命令替換符號處。由於命令替換的結果經常交給外部命令,不應該讓結果有換行的行為,所以預設將所有的換行符替換為了空格(實際上所有的空白符都被壓縮成了單個空格)。

例如:

[root@xuexi ~]# echo -e "

a\nb"a

b

[root@xuexi ~]# echo `echo -e "

a\nb\t \tc"`

a b c

使用雙引號引用可以保留空白符。

[root@xuexi ~]# echo "

`echo -e

"a\nb\t \tc"`"

ab c

從上面大概可以知道,命令替換分為兩個過程:(1)開啟子shell執行其中的命令(2)將子shell中的輸出結果打包插入在命令列中。但打包輸出結果的過程是可以控制的(例如上面使用雙引號)。

所以,如果想要將命令替換得到的多行結果儲存在變數中(變數儲存多行資料)。可以如下操作:

var="

`echo -e

"a b\n1 2"`

"# 命令替換加雙引號保護

echo

"$var

" # 變數引用也加雙引號保護

很多時候,在命令列中需要使用"cat a.txt|command"或者執行$(cat a.txt)來傳遞檔案a.txt中的內容,但這不是最好的方法。它們等價的效率更高的方法分別是"如果使用括號將一系列命令包圍,可以使得這些命令獨立於當前bash環境執行。這其實是乙個命令組。

例如:

[root@xuexi ~]# (umask 077;touch new.txt;ls -l new.txt)

-rw------- 1 root root 0 aug 13

22:46 new.txt

shell命令的替換

shell 命令替換是指將命令的輸出結果賦值給某個變數。比如,在某個目錄中輸入 ls 命令可檢視當前目錄中所有的檔案。shell 中有兩種方式可以完成命令替換,一種是反引號,一種是 使用方法如下 variable commands variable commands 其中,variable 是變數名...

shell中的命令替換和變數替換

可以用 command 也可以用 command 二者是有區別的,先看一下 command 注意 這裡不是引號,而反引號 下面這個是 command 變數替換可以根據變數的狀態 是否為空 是否定義等 來改變它的值,可以使用的變數替換形式 形式說明 變數本來的值 如果變數 var 為空或已被刪除 un...

Shell命令中的擴充套件和替換

shell的強大,很大程度上得益於對命令列做了額外的處理,你可以再命令中嵌入其他命令,在引數中嵌入其他命令,或者嵌入變數,插入路徑萬用字元,插入表示式,shell都能幫你處理的很好,就因為shell能做這些,所以shell才如此強大。廢話少說,直接開始。首先還是要囉嗦兩句,說說shell處理命令的過...