Bash 如何跳过for循环中ls的第一个元素
我正在执行一个命令,将文件夹中的文件列表作为输入。所以我在执行Bash 如何跳过for循环中ls的第一个元素,bash,shell,Bash,Shell,我正在执行一个命令,将文件夹中的文件列表作为输入。所以我在执行 cat <(for i in ls *chr*.txt; do echo $i; done) cat在这里根本不要使用ls。将文件放入数组中,可以从第二个元素开始展开数组 files=( *chr*.txt ) printf '%s\n' "${files[@]:1}" 在不支持数组的基线POSIX shell中,您可以出于相同的目的使用“$@”,同时shift删除第一项: set -- *chr*.t
cat <(for i in ls *chr*.txt; do echo $i; done)
cat在这里根本不要使用ls
。将文件放入数组中,可以从第二个元素开始展开数组
files=( *chr*.txt )
printf '%s\n' "${files[@]:1}"
在不支持数组的基线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.
不分析ls
的输出
您可以使用这一行:
for i in *chr*.txt; do ((first++)) && echo "$i"; done
或者使用数组:
# array holding matching files
arr=(*chr*.txt)
# loop through all but first file
for i in "${arr[@]:1}"; do
echo "$i"
done
切勿以这种方式使用ls
。请注意,echo$i
也有缺陷——它会损坏包含全局字符、空白等的文件名。请始终使用echo“$i”
,或者更好的是使用printf“%s\n'$i”
。看。请注意:听起来像一个。提供更多的上下文。你想跳过的那个名字是什么?我打赌我们可以在地球上解决它。@anubhava,嘿,你说得对。我是用“$@”
进行测试的,但是$0
是一个特例。@MAPK,一行程序在bash中是个坏主意。请记住,这是一种有着近50年向后兼容性遗产的语言——解决几十年前实现前代shell的人做出的错误决策所强制要求的所有默认值意味着为获得正确性而付出冗长的代价。你总是可以放一个如果出于某种原因确实需要将两个命令放在一行中,请在两个命令之间选择“代码>”。