Shell

什麼時候應該使用 $( ) 來定義變數

  • April 14, 2019

我遇到的一些 shell 腳本在定義變數時使用以下語法:

file_list_1=$(echo "list.txt")

或者

file_list_2=$(find ./)

我會使用:

file_list_1="list.txt"

file_list_2=`find ./`

我不確定以上哪個更好或更安全。x=$( )設置變數時使用語法有什麼好處?

從手冊(man bash):

$(命令)  或  *命令*

Bash 通過執行命令並用命令的標準輸出替換命令替換來執行擴展,並刪除任何尾隨的換行符。嵌入的換行符不會被刪除,但它們可能會在分詞過程中被刪除。命令替換$(cat 文件)可以替換為等效但速度更快的$(< 文件)

當使用舊式反引號形式的替換時,反斜杠保留其字面含義,除非後面跟著$,```或\。前面沒有反斜杠的第一個反引號終止命令替換。使用$(命令)形式時,括號之間的所有字元組成命令;沒有人受到特殊對待。

POSIX 標准定義了$()命令替換的形式。$() 允許嵌套命令並且看起來更好(易讀性)。它應該在所有Bourne shell上都可用。

您可以閱讀更多關於 IEEE Std 1003.1, Shell Command Language, Section 2.6.3 Command Substitution的內容。

至少有一個 Unix,AIX,記錄了反引號已經過時了。從那個連結:

雖然反引號語法被 ksh 接受,但它被 X/Open Portability Guide Issue 4 和 POSIX 標準認為已過時。這些標準建議可移植應用程序使用 $(command) 語法。

但是,/bin/sh不一定要符合 POSIX。因此,正如@Jeight 指出的那樣,在現實世界中有時仍然存在反引號的情況。

引用自:https://unix.stackexchange.com/questions/204949