2012-05-24 58 views
1

我試圖運行Apache啓動腳本,/etc/init.d/httpd。像這樣的一個環境變量的定義給出錯誤:這個shell腳本語法有什麼問題?

CONF_FILE=$(APACHE_HOME)/conf/httpd.conf 

它說"/etc/init.d/httpd: line 15: APACHE_HOME: command not found"

所以,我換成大括號,括號,和腳本順順當當工作。是什麼賦予了?我真的只是問這個問題,因爲我想明白爲什麼這是錯的,而不是如何解決它。 shebang在那裏,而且它從原始的shell腳本中沒有修改過,所以它爲什麼會誤解事物?

+0

爲什麼要括號?離開它們 – DonCallisto

+1

'$(foo)'嘗試運行'foo'作爲命令,並替換該命令的輸出。 APACHE_HOME不是一個命令。 –

+1

'$()'是命令插值,'$ {}'是變量替換 –

回答

2

在UNIX系統上:

$SOMETHING /* variable */ 
$(SOMETHINGELSE) /* command */ 
${FOO} */ variable substitution */ 
+0

是的,我現在看到了,但爲什麼httpd錯了?它是由Apache編寫的!帶「()」的 –

+0

????? – DonCallisto

1

$(something)通知shell執行命令something並替換該命令的輸出。

你要替換一個變量的輸出,所以你只需要一個$在變量的前面,就像這樣:CONF_FILE=$APACHE_HOME/conf/httpd.conf

或者,你可以使用CONF_FILE=${APACHE_HOME}/conf/httpd.conf(注意大括號,而不是括號),但它並不是真的需要你的情況。


當你想要一個命令的輸出分配給一個變量,這非常有用。例如:

MY_VAR="$(egrep 'someline' somefile.txt)" 
+0

在這樣的賦值中,引號並不是必需的。 – Kevin

+0

@Kevin良好的電話,將與即將到來的編輯一起編輯。 –

1

$(...)在子shell執行它的內容,它沒有得到一個變量的值。你可以使用簡單的$APACHE_HOME${APACHE_HOME},這聽起來像你切換到。