我不知道(用我有限的bash脚本技能)如何解决这个问题,我想以某种方式将变量组合到bash脚本中。我正在尝试以下几点:
#!/bin/bash
basearch=x86_64
ol7_channels="ol UEKR4 UEKR3"
ol6_channels="ol UEKR4 UEKR3 UEK"
ol5_channels="ol UEK"
for version in 7 6 5
do
for channel in ${ol${version}_channels}}
do
printf "Oracle Linux $version $channel $basearch"
done
done理想的产出是:
OracleLinux 7 ol x86_64
OracleLinux 7 UEKR4 x86_64
OracleLinux 7 UEKR3 x86_64
OracleLinux 6 ol x86_64
OracleLinux 6 UEKR4 x86_64
OracleLinux 6 UEKR3 x86_64
OracleLinux 5 ol x86_64
OracleLinux 5 UEKR4 x86_64
OracleLinux 5 UEKR3 x86_64我明白,像我做的那样,把一个变量放入一个变量中是行不通的。有人能告诉我怎么解决这个问题吗?
发布于 2017-03-27 17:53:33
另一种方法:
#!/bin/bash
#bash 4.0+
basearch=x86_64
declare -A channels=(
[7]="ol UEKR4 UEKR3"
[6]="ol UEKR4 UEKR3 UEK"
[5]="ol UEK"
)
#or for version in 5 6 7 #if you need ordered
for version in "${!channels[@]}"
do
read -a chanlist <<<"${channels[$version]}"
for channel in "${chanlist[@]}"
do
echo "$version $channel $basearch"
done
#or replace the whole "for channel" loop with the following line
#printf "$version %s $basearch\n" "${chanlist[@]}"
#but read charles's comment
done输出
7 ol x86_64
7 UEKR4 x86_64
7 UEKR3 x86_64
6 ol x86_64
6 UEKR4 x86_64
6 UEKR3 x86_64
6 UEK x86_64
5 ol x86_64
5 UEK x86_64发布于 2017-03-27 17:15:18
下面的代码实际上使用了真正的数组(而不是像对待数组一样对待字符串),并使用bash4.3特性名厨为这些数组创建一个别名。
#!/bin/bash
basearch=x86_64
channels_ol7=( ol UEKR4 UEKR3 )
channels_ol6=( ol UEKR4 UEKR3 UEK )
channels_ol5=( ol UEK )
for varname in "${!channels_ol@}"; do # iterate over variables starting with channels_ol
version=${varname#channels_ol} # trim prefix to get version number
declare -n channels=$varname # point channels nameref at our array
for channel in "${channels[@]}"; do # iterate over that array
printf 'Oracle Linux %s %s %s\n' "$version" "$channel" "$basearch"
done
unset -n channels # clear the nameref before proceeding
done发布于 2017-03-27 17:01:15
您可以先编写变量,然后使用可变间接参考。
#!/bin/bash
basearch=x86_64
ol7_channels="ol UEKR4 UEKR3"
ol6_channels="ol UEKR4 UEKR3 UEK"
ol5_channels="ol UEK"
for version in 7 6 5
do
varname="ol${version}_channels";
for channel in "${!varname}"
do
echo "Oracle Linux $version $channel $basearch"
done
done嵌套变量名不要在bash工作。
https://stackoverflow.com/questions/43051960
复制相似问题