2009-11-27 75 views
2
#!/bin/sh 
files = 'ls /myDir/myDir2/myDir3/' 

for file in $files do 
    echo $file 
    java myProg $file /another/directory/  
done 

我試圖在/ MYDIR/myDir2/myDir3 /做的就是通過每一個文件名重複,然後在調用使用該文件名作爲第一個參數一個java程序(第二個參數是「/ another/directory」)外殼腳本調試的幫助 - 通過文件的目錄遍歷

當我運行這個腳本時:。 myScript.sh

我得到這個錯誤: -bash:文件:找不到命令

我是怎麼在我的劇本做錯了什麼?謝謝!

回答

5

按照Neeaj的回答,剝離files =的空格。

更好

然而,使用:

#!/bin/sh -f 
dir=/myDir/MyDir2/MyDir3 

for path in $dir/*; do 
    file=$(basename $path) 
    echo "$file" 
    java myProg "$file" arg2 arg3 
done 

Bash是完全有能力擴大*通配符本身,不產卵的ls副本爲它做的工作的!

編輯:改爲呼叫basename而不是echo以滿足OP(先前未聲明)要求路徑回聲是相對而非絕對的。如果CWD沒關係,那麼就再好不過我會去:

#!/bin/sh -f 
cd /myDir/MyDir2/MyDir3 

for file in *; do 
    echo "$file" 
    java myProg "$file" arg2 arg3 
done 

,並避免basename來電乾脆。

+0

我希望basename $文件成爲java參數的輸入。不只是迴應它。 – Saobi 2009-11-27 20:51:11

+0

java程序如何在沒有完整路徑的情況下讀取文件?如果這不是問題,那麼您可以在腳本開始時只'cd $ dir'。 – Alnitak 2009-11-27 21:24:07

+0

這可以通過使用'printf'%s \ n'「$ file」'來改進,而不是破壞的和棄用的回聲。然後它將與名爲'-n','-e'等的文件和包含空格的文件一起工作。不要忘記在任何地方引用'$ file'。 – Jens 2012-05-16 18:14:15

1

條關斷和之後的空白files =files=RHS of assignment

1

刪除包圍 '=' 的空間:變化

files = 'ls /myDir/myDir2/myDir3/' 

成:

files='ls /myDir/myDir2/myDir3/' 

並移動 '做'聲明到自己的行:

for file in $files 
do 
    .... 
+0

沒有。 現在的錯誤是:語法錯誤附近的意外令牌'回聲' – Saobi 2009-11-27 19:56:21

+0

是的,因爲你錯過''''之前'''看到我的答案。 – Alnitak 2009-11-27 19:58:50

+0

現在好了問題是,它迴響了完整路徑,而不僅僅是文件夾名稱本身。我希望「myFolder」得到迴應。不是「/ myDir/Mydir2/myfolder」 – Saobi 2009-11-27 20:02:02

0

引用您的變量並且不需要使用ls。

#!/bin/sh 
for file in /myDir/myDir2/* 
do 
    java myProg "$file" /another/directory/  
done