for + 数组 + 参数

for + 数组 + 参数

我的 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

如果我们谈论ksh93or 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 擅长运行命令(例如awkfind),这就是它们的设计目的。

相关内容