2009-11-27 73 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