例子:
$ eval echo "{x,y,z}\ --opt\; "
x --opt; y --opt; z --opt;
假设第二个列表是{1,2,3}
且其长度等于第一个(初始)列表的长度。
问题:
- 农产品制作方法
bash
:
x --opt 1; y --opt 2; z --opt 3;
- 如何制作
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 显式分割。
该代码纯粹是作为一个有趣的花絮呈现的。