2012-01-31 112 views
1

我有我的UNIX腳本文件中的以下行:UNIX腳本錯誤

if [[ -f $DIR1/$FILE1 ] -a [ -f $DIR1/$FILE2 ]]; then 

由於明確了線檢查兩個文件存在於一個目錄,如果這兩個文件都存在,一些邏輯將被執行。

但是,在運行該腳本我正在上面線以下錯誤:

test_script: line 30: syntax error at line 54: `]' unexpected 

線54就是上面一行出現。

這個錯誤是什麼意思?我錯在哪裏?

感謝您的閱讀!

回答

1

對於最常見的殼體,至少[]不像C中的圓括號,然後用它來對子表達式進行分組。

你需要的是像(爲bash):

if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then 

如果你想與特定的幫助(非bash)外殼,你應該讓我們知道你正在使用哪一個。

0

你有額外的[]

if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then 

基本上,你是混合兩種語法的目的是做同樣的事情:即[ ][[ ]]。前者更便攜,但後者更強大;儘管你會遇到的大部分炮彈都支持[[ ]]

但更好的方法是,因爲你已經在使用[[ ]]構建

if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then 
1

它有多種答案解釋之間的細微差別有趣[和[,但由於某些原因,我們的文化似乎從提供顯而易見的解決方案勸阻的人。停止使用'['完全。而不是「[」,使用的測試:

 
if test -f $DIR1/$FILE1 && test -f $DIR1/$FILE2; then 

測試比「[」更清晰的語法,這需要一個最終的「]」的說法不斷迷惑人,以爲括號內是語言的一部分。 '[''不是可移植的,並且讓那些沒有意識到許多shell提供非標準功能的人感到困惑。有一種情況是[[可以比[更高效],但是如果運行時性能在你的shell中是一個問題,那麼你可能不應該在sh中解決這個問題。

0

由於@paxdiablo所述,您可以使用這種方式:

if -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ; then 

,或者你可以用這種方式:

if -f $DIR1/$FILE || -f $DIR1/$FILE2 ;