bash 大括号扩展:是否可以将另一个列表与初始列表相关联?

bash 大括号扩展:是否可以将另一个列表与初始列表相关联?

例子:

$ eval echo "{x,y,z}\ --opt\; "
x --opt; y --opt; z --opt;

假设第二个列表是{1,2,3}且其长度等于第一个(初始)列表的长度。

问题:

  1. 农产品制作方法bash
x --opt 1; y --opt 2; z --opt 3;
  1. 如何制作bash产品(即引用列表中的元素{x,y,z}):
x --opt x; y --opt y; z --opt z;

单衬是优选的。

答案1

大括号扩展将创建所有可能的对,它不会并行遍历两个列表:

$ echo {x,y,z}' --opt; '{1,2,3}
x --opt; 1 x --opt; 2 x --opt; 3 y --opt; 1 y --opt; 2 y --opt; 3 z --opt; 1 z --opt; 2 z --opt; 3

要产生所需的输出,您需要使用其他东西。例如,循环数组的索引:

#! /bin/bash
opt1=(x y z)
opt2=(1 2 3)
for i in "${!opt1[@]}" ; do
    printf '%s --opt %s; ' "${opt1[i]}" "${opt2[i]}"
done
echo

或者,使用关联数组:

#! /bin/bash
declare -A opts=([x]=1 [y]=2 [z]=3)
for i in "${!opts[@]}" ; do
    printf '%s --opt %s; ' "$i" "${opts[$i]}"
done
echo

答案2

乔罗巴指出,使用{x..z}' --opt '{1..3}';'将生成所有可能的字符串组合。

从所有可能的组合列表(1 到 9)中,我们需要每四个组合 1、5 和 9。

set -- {x..z}' --opt '{1..3}';'
eval echo '${'{1..9..4}'}'

或者,使用数组,获取元素 0、4 和 8。

strings=( {x..z}' --opt '{1..3}';' )
eval echo '${strings['{0..8..4}']}'

请注意,我永远不会编写这样的真实代码,并且上面的代码生成的字符串实际上对于用作真实命令/参数是无用的,因为它们需要由 shell 显式分割。

该代码纯粹是作为一个有趣的花絮呈现的。

相关内容