2016-09-27 56 views
1

我編寫了這個腳本,用一個命令編譯和運行我的C和java程序。爲什麼Shell腳本運行時懸掛'}'?

 1 run(){ 
    2  gcc -lm $1 && (shift; ./a.out $*) 
    3  } 
    4 
    5 jrun(){ 
    6  clas=`echo $1 | cut -d'.' -f1 ` 
    7  javac $1 && { shift; java $clas $* } 
    8 } 

但是在運行中出現錯誤。

# source t.sh 
-bash: t.sh: line 9: syntax error: unexpected end of file 

當我在最後添加'}'時腳本成功運行。

剛纔意識到我用{}而不是()line 7

我的問題是爲什麼它運行並與一個danging '}'罰款工作?

+0

什麼都不是懸掛。最後一個'}'完成'jrun {}'。 – VM17

+0

請勿使用行號郵寄代碼。 – tripleee

+0

用行號碼發帖,因爲錯誤表示行號。 – Yogesh

回答

5

$*後面需要分號來分隔大括號。事實上,它只是被解釋爲javac的一個參數。

順便說一句,你可能正在尋找

run(){ 
    gcc -lm "$1" || return 
    shift 
    ./a.out "[email protected]" 
    } 

jrun(){ 
    javac "$1" || return 
    local clas=${1%.*} 
    shift 
    java "$clas" "[email protected]" 
} 

,修正了許多報價的問題,避免了略顯笨拙複合命令。 local聲明可以防止該函數使用相同的名稱來破壞全局變量,但它是一種雙擊操作。

+0

另外,這看起來有點模糊,就像它想成爲一個'Makefile'。 – tripleee

3

問題在於你的塊 - 你錯過了一個分號。

它可以用這個例子來重現:

true && { echo } # missing semicolon 

如果您在交互式終端運行它,外殼將留給等待接收進一步的輸入。如果輸入一個額外的右括號,然後你會看到的echo }輸出:

} 

由於殼解析的方式,需要有最後的陳述和前花括號之間換行或分號塊的結尾。

true && { echo; } # works 
3

我的問題是,爲什麼它運行,並與danging '}' 正常工作?

它沒有。您提供的代碼是缺少一個}。您需要在bash之前添加一個接受它。

的問題是第7行:

javac $1 && { shift; java $clas $* } 

{}不是shell字符。它們的意義是依賴於上下文的,特別是它們可以看起來不像是普通的貝殼字。故障線路上的}因此是java命令的參數,而不是右大括號。你想要麼這個:

javac $1 && { shift; java $clas $*; } 

或本:

javac $1 && { 
     shift 
     java $clas $* 
    } 

或那些有一些變化。