加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在bash中一次循环变量2元素

发布时间:2020-12-16 01:51:58 所属栏目:安全 来源:网络整理
导读:我有一个bash变量,它是一个以空格分隔的字符串列表,并且希望循环从该列表一次迭代2个元素.我已经确定列表的长度可以被2整除.所以我想要类似的东西: x="a bb cccc d"while read first second; do echo "($first,$second)"done $x 输出应该是: (a,bb)(cccc,d
我有一个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和$second. echo作为占位符放入.
我正在寻找一个有效的答案(最好没有柜台).

解决方法

根据您对值的要求,您可以执行以下操作:

$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命名.但是,你可以使用一个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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读