繁体   English   中英

bash传递参数/参数?

[英]bash passing arguments/parameters?

#!/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脚本文件相同的目录中运行该程序且传递的任何其他参数被完全忽略时,该参数才有效。

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

代码有什么问题,谢谢!

发生这种情况是因为函数中的$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"/* )扩展命令

您无需为此呼叫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
}

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

  1. 您不带参数调用traverse
  2. 遍历函数中的$1为空,因此$x为空
  3. 因此,测试为[ -d ] ,当[被赋予1个参数时,如果参数不为空,则返回成功。 您的if命令始终执行“ true”块,而x为空时ls $x只是ls

[[ ... ]]与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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM