2014-10-03 36 views
0

我想知道下面兩個命令之間的區別是什麼?瞭解在bash中使用命令替換

ubuntu:~/bin$ (ls -A1 /home/ | wc -l) 
1 

ubuntu:~/bin$ $(ls -A1 /home/ | wc -l) 
1: command not found 

如果我把dir_count=(ls -A1 /home/ | wc -l)放在腳本中,我得到下面的錯誤。

./two_args: line 24: syntax error near unexpected token `|' 
./two_args: line 24: `dir_1_count=(ls -A1 "$dir_1" | wc -l)' 

這裏作爲了以下工作:

dir_count=$(ls -A1 /home/ | wc -l) 
+0

您可以用'var = $(command)'定義一個變量。所以你必須使用'dir_count = $(ls -A1/home/| wc -l)'。不管它是腳本還是控制檯。 – fedorqui 2014-10-03 13:16:42

回答

1

$(command),是command substitution。它只是執行命令並替換命令的標準輸出。

所以,如果你想設置的變量,簡單地說:dir_count=$(ls -A1 /home/ | wc -l)

關於你的代碼的其餘部分:

(ls -A1 /home/ | wc -l) 

這一個執行一個子shell命令。你可能不想要那些括號。

$(ls -A1 /home/ | wc -l) 

這一個只是沒有任何,你替換的結果,所以你得到1,和外殼將嘗試執行命令調用1

0

在腳本簡化變量管理,我建議你嘗試以下方法:

dir_1_count=`ls -A1 ${dir1} | wc -l` 

使用字符 「`」 到定界變量並在腳本中存儲常用shell命令的結果。

記得使用倒排撇號,而不是單引號,複製我剛剛給你的變量定義。

+0

感謝您的提示,但這並不能回答我的問題。我會嘗試你的方法。但仍然在尋找答案。 – nocl 2014-10-03 13:34:39

+1

這是舊式的命令替換,並不推薦(它沒有錯,但靈活性較差,難以用人眼分析) – 2014-10-03 13:36:01

0

(...)只是一個特殊的分組操作符。它在子shell中運行...,這意味着它不能修改父級的執行環境(因此,例如,(foo=bar)是無用的,因爲賦值不會在命令結束時存活),但是在其他情況下通常會處理得相當正常(其標準輸出去標準輸出等)。


$(...)是一種替代;就像如何將$foo替換爲變量foo的值,將$(...)替換爲命令...的輸出。更確切地說 。 。 。如(...),它也在子shell中運行...,但此外,它還捕獲...的標準輸出,然後以輸出取代。因此,舉例來說,這樣的:

"$(echo cd)" "foo$(echo bar)" 

運行echo cd並捕獲cd,並運行echo bar並捕獲bar,然後運行合併命令cd foobar