我的 for 循环有问题,这就是我想要的:
for arg
do
array[index]=(`find $arg -type l -maxdepth $depth -printf "%p\n" `)
index++
done
fi
arg
- 位置参数,仅限目录
这个循环遍历参数并找到符号链接,我希望它们存储在数组中。如果我仅使用一个目录运行脚本,它可以正常工作,但是当我输入两个或更多目录时,它就不起作用。有什么帮助吗?
我想像这样工作,例如:
有两个参数,每个参数都是目录。
循环首先将 arg 设置为第一个目录,然后数组填充符号链接,例如它将找到 2 个符号链接,因此 array[0] array[1] 将是该链接,然后它应该继续使用第二个 arg,例如有 3 个符号链接,它应该将它们设置为 array[2] array[3] array[4]
答案1
如果我们谈论ksh93
or bash
(和 GNU find
),没有多维数组(或数组的数组),你可以这样做:
index=0 IFS=$'\n'
set -f
for arg do
eval "array_$index"'=($(find "$arg" -type l -maxdepth "$depth" -print))'
((index++))
done
要将不同的数组称为array_0
, array_1
...
(上面假设文件名不包含换行符)。
如果您希望将所有链接合并到一个数组中,那么:
IFS=$'\n'
set -f
array=($(find "$@" -type l -maxdepth "$depth" -print))
应该足够了。
在 shell 中使用数组或循环通常表明您没有以正确的方式解决问题。
例如,如果你想找到最深的符号链接(正如您的评论所建议的),您会执行以下操作:
find "$@" -type l -print | awk -F/ '
NF > n {deepest = $0; n=NF}
END {print "Deepest:", deepest}'
awk
在处理文本和使用数组方面,它会比 shell 更加高效。它就是为此而设计的。 Shell 则不然(bash
在所有 shell 中,它是效率最低的之一)。 Shell 擅长运行命令(例如awk
或find
),这就是它们的设计目的。