Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bashshell脚本:如何将参数列表分组为N个项目?_Bash_Shell - Fatal编程技术网

bashshell脚本:如何将参数列表分组为N个项目?

bashshell脚本:如何将参数列表分组为N个项目?,bash,shell,Bash,Shell,这里的用例是,我希望获取一组文件,比如*,并在循环中使用它们构建arglist,N。比如说, $ ls a.jpg b.jpg v.jpg z.jpg 123.jpg 1234.jpg N这里有两个,我想运行例如命令a.jpg b.jpg,命令v.jpg,z.jpg,等等 我怎么做 for file in *; do command [???] done 它不必使用for循环。希望有一个我还不知道的UNIX实用程序能够稍微重新排列arg列表。或者也许我得用tr和IFS做些有趣的事情

这里的用例是,我希望获取一组文件,比如
*
,并在循环中使用它们构建arglist,
N
。比如说,

$ ls 
a.jpg
b.jpg
v.jpg
z.jpg
123.jpg
1234.jpg
N
这里有两个,我想运行例如
命令a.jpg b.jpg
命令v.jpg,z.jpg
,等等

我怎么做

for file in *; do
    command [???]
done
它不必使用for循环。希望有一个我还不知道的UNIX实用程序能够稍微重新排列arg列表。或者也许我得用
tr
IFS
做些有趣的事情

如果我的文件以数字命名,或者如果我只想使用数字而不是对全局扩展文件进行操作(本例中的
N
=3),我可以这样做:

这就产生了

0 1 2
3 4 5
6 7 8
9 10 11

我采用了一种手动直接累积法。像这样的

我正在制作imagemagick脚本

i=0
targdir=$2
accum=
for image in $(ls $1); do
    accum="$accum $image"
    if [[ $((i % 2)) -eq 1 ]]; then
        echo testing $accum
        accum=
    fi
    ((i ++))
done

请参阅
xargs
及其
-n
选项

ls | xargs -n3 command

如果文件名包含空格,则可能需要使用
-0
选项和
使用
-print0
查找
来列出文件。

另一个选项是使用bash数组:

files=(*)
for number in $(seq 0 3 $((${#arr[@]}-1)) ); do
    echo "${files[number]}" "${files[number+1]}" "${files[number+2]}"
done

在纯
bash
中,这里有一种非常干净的方法,不需要
xargs
,也不需要正确处理文件名中的空格:

set -- *
while [ $# -gt 0 ]; do
    file1="$1"; shift
    file2="$1"; shift
    # ./do_something "$file1" "$file2"
done

我在写这篇文章的时候注意到“一个新的答案…”-你抢先了我。我知道这一点。为什么我忘记了
xargs
可以做到这一点
xargs
甚至可以并行化脚本。对我的imagemagick脚本也非常有用。@StevenLu这对文件名中的空格不起作用,但在您的特定情况下,这可能不是问题。请参阅我的答案,以了解不带
xargs
的备选方案。
set -- *
while [ $# -gt 0 ]; do
    file1="$1"; shift
    file2="$1"; shift
    # ./do_something "$file1" "$file2"
done