#!/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脚本文件相同的目录中运行程序并且我通过的任何其他参数时才能工作被完全忽略了。
脚本应该接受一个参数并检查它是否是一个目录,如果它是一个目录,则按降序列出所有文件/文件夹。如果没有显示错误信息。
代码有什么问题,谢谢!
答案 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)
“那个人”有正确的答案。它总是查看当前目录的原因:
traverse
$1
为空,因此$x
为空[ -d ]
,当[
给出1个参数时,如果参数不为空,则返回成功。您的if
命令始终执行“true”块,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