2014-02-13 165 views
0
#!/bin/bash 

traverse() { 
local x=$1 
if [ -d $x ] 
then 
lst=(`ls $x`) 
for((i=${#lst[@]}; --i;)); do 
    echo "${lst[i]}" 
    done 
else echo "not a directory" 
fi 
} 

traverse 

我希望在执行程序时传递一个参数,比如“/路径/到/本/目录/”,但如果我在同一目录作为我的bash脚本文件,运行该程序只能和我通过的任何其他参数完全被忽略。bash传递参数/参数?

该脚本应该采取一个参数,并检查它是否是一个目录,如果它是一个目录,然后按降序列出所有的文件/文件夹。如果不显示错误消息。

代码有什么问题,谢谢!

回答

3

发生这种情况是因为$1在函数中是指traverse的参数,而不是脚本的参数。

要与每个参数运行一次你的功能,使用

for arg in "[email protected]" # "[email protected]" is also the default, so you can drop the 'in ..' 
do 
    traverse "$arg" 
done 

如果在未来要将所有脚本的参数传递给一个函数,使用

myfunc "[email protected]" 

这仅仅是个问题尽管如此。其他问题包括不引用您的变量和使用命令扩展ls,而不是globs,lst=("$x"/*)

+0

@ [那个人]感谢非常有帮助的信息!现在按我的预期运行! – user3016065

3

您不需要为此调用ls。您可以使用此代码:

traverse() { 
    local x="$1" 
    if [ -d "$x" ]; then 
     arr=("$x/"*) 
     for ((i=${#arr[@]}; i>0; i--)); do 
      echo "${arr[$i]}" 
     done 
    else 
     echo "not a directory" 
    fi 
} 
0

“那个男人”有正确的答案。它总是着眼于当前目录的原因:

  1. 调用traverse不带参数
  2. 在遍历功能$1是空的,因此$x是空
  3. 测试因此[ -d ],当[给出1个参数,如果参数不为空则返回成功。你if命令始终执行“真正的”块ls $x只是ls当x是空

使用[[ ... ]]使用bash:它是关于空参数聪明。否则,引用你的变量:

$ x=; [ -d $x ] && echo always true || echo not a directory 
always true 
$ x=; [[ -d $x ]] && echo always true || echo not a directory 
not a directory 
$ x=; [ -d "$x" ] && echo always true || echo not a directory 
not a directory