#!/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
}
那个人"有正确的答案。它总是查看当前目录的原因:
- 您调用没有参数的
traverse
- 遍历函数中的
$1
为空,因此$x
为空 - 因此,该测试是
[ -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