shell的命令替換和命令組合


bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


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)反引號處理反斜線的轉義規則比較不明確,但是$()中的反斜線會按正常的方式轉義。參見http://mywiki.wooledge.org/BashFAQ/082

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

例如:

[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"`"
a
b               c

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

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

var="`echo -e "a b\n1 2"`"   # 命令替換加雙引號保護
echo "$var"   # 變量引用也加雙引號保護

很多時候,在命令行中需要使用"cat a.txt|command"或者執行$(cat a.txt)來傳遞文件a.txt中的內容,但這不是最好的方法。它們等價的效率更高的方法分別是"<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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM