2016-12-02 78 views
1

所以下面是我在我的bash腳本中的代碼。我收到一個錯誤,說二元運算符預期當我給命令2個參數(不給錯誤,當我給1個參數)。它會改變文件權限,當我給出2個參數,因爲我可以看到它時,我做ls -l但它仍然給我這個錯誤。我如何解決它?Unix bash錯誤 - 二元運算符預計

for file in [email protected] 
do 
    chmod 755 $file 
done 

if [ -z [email protected] ] 
then 
     echo "Error. No argument." 
     exit $ERROR_CODE_1 
fi 

我已經加入此現在

if [ ! -f "$*" ] 
then 
     echo "Error. File does not exist" 
     exit $ERROR_NO_FILE 
fi 

但現在當我輸入超過1種說法只是做一切if語句(即打印error.file不存在),即使文件確實存在。

+0

不要更改您的問題。如果你有一個*新的問題,你應該把它作爲一個新的,而不是改變你現有的*問題。 – andlrc

回答

3

這樣一種說法:只是問多少參數進行傳遞:

... 
if [ $# -eq 0 ] 
... 

你得到的錯誤在你的代碼,因爲$ @變量擴展到多個字,這讓該test命令看起來像這樣:

[-z PARM1 parm2 parm3 ...]

+0

你是男人兄弟。非常感謝。 – pogba123

+0

引用'$ @'仍然可以給'-z'多個參數;這些參數中的空白僅保留。 – chepner

+0

,它會教我不經測試就回答!謝謝,@chepner! –

0

裹在雙引號中的參數,以避免字splitti Ng和路徑擴展:

for file in "[email protected]" 
do 
    chmod 755 "$file" 
done 

if [ -z "$*" ] # Use $* instead of [email protected] as "[email protected]" expands to multiply words. 
then 
     echo "Error. No argument." 
     exit "$ERROR_CODE_1" 
fi 

但是,您可以更改代碼一點:

for file # No need for in "[email protected]" as it's the default 
do 
    chmod 755 "$file" 
done 

if [ "$#" -eq 0 ] # $# Contains numbers of arguments passed 
then 
    >&2 printf 'Error. No argument.\n' 
    exit "$ERROR_CODE_1" # What is this? 
fi 
+0

非常感謝兄弟 – pogba123

+0

我已經在問題框中更新了我的代碼,並且得到了一個不同的錯誤,請你能幫助我。我是一名初學者,需要幫助。 – pogba123

2

[email protected]是擴展到所有的參數,它們之間的空間,所以它看起來像:

if [ -z file1 file2 file3 ] 

-z只期望一個單詞。您需要使用$*和引用它,所以它擴展成一個字:

if [ -z "$*" ] 

這將擴展到:

if [ -z "file1 file2 file3" ] 

或者只是檢查參數的個數:

if [ $# -eq 0 ] 

您還應該在for循環之前進行此檢查。並且您應該引用for循環中的參數,因此您不會遇到有空格的文件名問題:

for file in "[email protected]" 
+0

感謝人感激。 – pogba123

+0

我已經在問題框中更新了我的代碼,並且正在獲取不同的錯誤,請幫助我。我是一名初學者,需要幫助。 – pogba123

+0

'-f'後面只有一個文件名,但是你將所有的文件名參數合併到一個測試中。 – Barmar