【问题标题】:bash do loop with length of directorybash do循环与目录长度
【发布时间】:2016-08-16 10:29:43
【问题描述】:

我正在尝试遍历目录中的文件名,以便对每个文件名执行操作。

如果我使用,我只能遍历 10 个文件名:

var=($(ls directory))
for k in {1..10}
do
    echo ${var[$k]}
done

这给了我目录中的前 10 个文件名。但是,我想遍历它们。

如果我这样做:

length=($(ls directory -1 | wc -l))

我得到了长度(对于这个例子,它是 62)

所以当我把所有东西结合在一起时:

var=($(ls directory))
length=($(ls directory -1 | wc -l))
for k in {1..$length} 
do
    echo ${var[$k]}
done

我收到错误“语法错误:预期操作数(错误标记为“{1..62}”)

任何解决此问题的帮助或更好的解决方案将不胜感激!

【问题讨论】:

  • Brace expansion 既强大又有限。请注意,它发生在任何变量展开之前,因此任何使用{1..$length} 的尝试都注定要失败。

标签: bash list loops directory names


【解决方案1】:

为什么不简单:

for file in *; do
  if [ -f "$file" ]; then
    echo "Do what you want with" "$file"; 
  fi
done

【讨论】:

  • 您的答案和其他答案(我输入的)都没有处理的一个问题是ls directory 部分。在某种程度上,使用directory/* 会起作用;它会以可用的格式给出名称(shopt -s nullglob 可能是有益的)。但是,ls 命令只会给出file,而directory/* 会产生directory/file。这可以在循环中处理(例如通过basename,或通过小警告${file##*/})。
  • 添加了获取文件的测试。
  • @JonathanLeffler:或:(cd directory; for file in *; do ...; done)
  • @rici:这可能没问题,除非处理依赖于在每个处理步骤开始时位于当前目录中,而不是在远程目录中。问题可能与未找到的命令或文件有关
【解决方案2】:

大括号扩展是由 shell 在变量扩展之前执行的,因此您会收到错误消息。

你可以使用:

for k in $(seq 1 "$length")

解决问题。


您正在做的事情也可以通过以下方式轻松完成:

files=( * )
for i in "${files[@]}"; do echo "$i"; done

甚至更简单:

printf '%s\n' "${files[@]}"

【讨论】:

  • 完美!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2011-12-16
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多