bash传递参数/参数?

时间:2014-02-13 18:16:18

标签: bash parameters arguments

#!/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

我想在执行程序时传递一个参数,例如“/ path / to / this / directory /”,但只有当我在与bash脚本文件相同的目录中运行程序并且我通过的任何其他参数时才能工作被完全忽略了。

脚本应该接受一个参数并检查它是否是一个目录,如果它是一个目录,则按降序列出所有文件/文件夹。如果没有显示错误信息。

代码有什么问题,谢谢!

3 个答案:

答案 0 :(得分:3)

这是因为函数中的$1引用了traverse的参数,而不是脚本的参数。

要使用每个参数运行一次函数,请使用

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

如果您将来想要将所有脚本的参数传递给函数,请使用

myfunc "$@"

但这只是手头的问题。其他问题包括不引用变量并使用命令扩展ls,lst=(`ls $x`),而不是globs,lst=( "$x"/* )

答案 1 :(得分: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
}

答案 2 :(得分:0)

“那个人”有正确的答案。它总是查看当前目录的原因:

  1. 你没有参数调用traverse
  2. 遍历函数中的$1为空,因此$x为空
  3. 因此测试为[ -d ],当[给出1个参数时,如果参数不为空,则返回成功。您的if命令始终执行“true”块,ls $x只有ls当x为空时
  4. [[ ... ]]与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