在Shell腳本中,當我們vim test.sh輸入以下文本:
echo date
echo `date`
echo $(date)
執行./ test.sh,顯示:
date
2017年 06月 26日 星期一 15:56:04 CST
2017年 06月 26日 星期一 15:56:04 CST
在這個例子中,我們可以看出,第一個是直接打印date字符串,而二三則是先執行date命令,然後將執行的結果打印出來。
因此,總結一下,倒引號和$()都是先執行命令然後將執行的結果替換到當前命令行。 然而這兩者有什麼區別嗎?
區別是:當倒引號或者$() 和轉義字符一起使用會有不同
我們還是看一個例子:
echo `echo \$PWD`
echo $(echo \$PWD)
當執行./ test.sh 結果顯示爲:
/home/xuyang/bit_class/script_shell
$PWD
爲什麼會這樣?我們根據結果來分析,第一個打印PWD裏面的內容,說明 \ 並沒有什麼卵用,而第二個只輸出了PWD,說明轉義字符起作用了,因此我們可以推測:
**倒引號已經對 \ 已經轉義了,因此想要實現轉義需要再加個 \
而$()則沒影響,\照常使用**
我們驗證下推測:
echo `echo \\$PWD`
echo $(echo \\$PWD)
當執行./ test.sh 結果顯示爲:
$PWD
\/home/xuyang/bit_class/script_shell
結果驗證了我們的猜想:
對於倒引號,\\表示轉義,對$進行轉義,這樣子就打印出$PWD四個字母,說白了在倒引號中想要轉義,必須成對使用\
對於$(),\\則表示對第二\轉義,因此會先打印出\,然後再打印出當前目錄
和上面兩者類似的還有一個命令,eval,那麼eval是什麼?又該如何使用?與上面有什麼區別?
eval [arguments]主要用來兩次掃描參數
比如
redirect=">"
ls $redirect file
eval ls $redirect file
當使用eval時候,第一次掃描將$redirect替換爲>,第二次執行ls > file,因此完成重定向功能。
eval可以取得最後的參數:eval echo \$$#
用eval命令創建指向變量的“指針”,有點類似第一點
#!/bin/bash
x=10
ptr=x
eval echo \$$ptr
eval $ptr=20
eval echo \$$ptr
結果是:
10
20
關於eval參考了這篇博客