如何在for循环中跳过ls的第一个元素

MAP*_*APK -1 bash shell

我正在执行一个命令,该命令将我文件夹中的文件列表作为输入。所以我正在执行

cat <(for i in ls *chr*.txt; do echo $i; done)
Run Code Online (Sandbox Code Playgroud)

但是,我不想包含此列表中的第一个条目。换句话说,我想跳过迭代 1,所以我只有 n-1 个*chr*.txt文件。我该怎么做呢?

Cha*_*ffy 8

根本不要ls在这里使用。将您的文件放入一个数组中,您可以从第二个元素开始扩展该数组。

files=( *chr*.txt )
printf '%s\n' "${files[@]:1}"
Run Code Online (Sandbox Code Playgroud)

在不支持数组的基线 POSIX shell 中,您可以"$@"出于相同的目的使用,并shift删除第一项:

set -- *chr*.txt    # put all names matching the pattern in $1/$2/...
shift               # remove $1, putting $2 in its place, moving $3 to $2, etc
printf '%s\n' "$@"  # print each item from our argument list on a separate line.
Run Code Online (Sandbox Code Playgroud)

  • @MAPK,在 bash 中,单行是一个坏主意。请记住,这是一种具有近 50 年向后兼容性遗产的语言 - 解决由几十年前实现前身 shell 的人们做出的错误决定所强制执行的所有默认值意味着要付出冗长的代价才能获得正确性。如果您出于某种原因确实希望将两个命令放在一行上,则可以随时在两个命令之间放置一个“;”。 (2认同)