#!/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/目录/”,但只有在运行与bash脚本文件相同的目录下才能工作,而我传递的任何其他参数都被完全忽略。
脚本应该接受一个参数,并检查它是否是一个目录,如果它是一个目录,然后按降序列出所有文件/文件夹。如果没有显示错误消息。
代码有什么问题,谢谢!
发布于 2014-02-13 18:21:33
这是因为函数中的$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"/* )。
发布于 2014-02-13 18:22:15
你不需要为此打电话给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
}发布于 2014-02-13 18:34:00
“另一个人”的答案是正确的。它总是查看当前目录的原因是:
traverse时不带任何参数$1为空,因此$x为空。[ -d ],当[被赋予一个参数时,如果参数不是空的,则返回成功。您的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 directoryhttps://stackoverflow.com/questions/21762316
复制相似问题