gpt4 book ai didi

bash - 在 bash 中一次循环遍历变量 2 个元素

转载 作者:行者123 更新时间:2023-11-29 09:07:10 26 4
gpt4 key购买 nike

我有一个 bash 变量,它是一个以空格分隔的字符串列表,我想要一个从该列表中一次迭代 2 个元素的循环。我已经确保列表的长度可以被 2 整除。所以我想要这样的东西:

x="a bb cccc d"
while read first second; do
echo "($first,$second)"
done <<< $x

输出应该是:

(a,bb)
(cccc,d)

目前上述产量:

(a,bb cccc d)

注意:我需要在我的循环中分配$first$secondecho 作为占位符放入。我正在寻找一个有效的答案(最好没有计数器)。

最佳答案

根据你想用这些值做什么,你可以做这样的事情:

$ x="one two buckle myShoe"
$ xargs -n 2 printf "(%s,%s)\n" <<<$x
(one,two)
(buckle,myShoe)

不过,我假设您真的想将值分配给 shell 变量,并且您预期的循环主体比简单的格式化打印更复杂。事实上,由于 printf 会自动重复格式,直到它的参数用完,所以上面示例中的 xargs 是不必要的;它可能只是:

printf "(%s,%s)\n" $x

不幸的是,xargs 不是内置的,因此您不能 xargs 任意 bash 管道。您也不能只定义一个 shell 函数并为 xargs 命名。但是,您可以xargs bash 子shell,它提供了一个非常通用的解决方案:

# Shell function which takes two arguments
doit() {
echo "Number of arguments: $#"
echo "First argument: $1"
echo "Second argument: $2"
}
# Make the function visible to subshells
export -f doit

x="one two buckle myShoe"
xargs -n2 bash -c 'doit "$@"' _ <<<$x

最后,根据评论中的讨论,您可以使用 printfxargs(但可能 printf 更有效,因为它是内置的)将列表重新组织成对,然后将其送入 while read 循环:

printf "%s %s\n" $x |
while read -r first second; do
echo "($first,$second)"
done

关于bash - 在 bash 中一次循环遍历变量 2 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22199868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com