shell腳本中倒引號,$(), eval的區別

在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參考了這篇博客

發佈了96 篇原創文章 · 獲贊 119 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章