我正在尝试使用范围进行bash函数参数。
以下工作代码可提供所需的结果:
ddos_attack_mirroring_defense() {
echo $1;
}
ddos_attack_mirroring_defense()您好NSA
给出:
Hi NSA
但以下范围无效:
ddos_attack_mirroring_defense() {
printf "regx32%0.s" {1..$1};
}
ddos_attack_mirroring_defense 5 返回:
regx32
而不是:
regx32regx32regx32regx32regx32
我尝试了空间和其他不同的外壳,但它们仍然不起作用:
$(1) ${1}
我在这里做错了什么,我该如何解决?
答案 0 :(得分:3)
支撑扩张在变量扩张之前发生。因此,您不能在范围中使用变量,只能使用文字。
请参阅man bash
:
扩展的顺序是:大括号扩展,波浪扩展,参数,变量和算术扩展以及命令替换(以从左到右的方式完成),单词拆分和路径名扩展。
答案 1 :(得分:1)
试试这个:
ddos_attack_mirroring_defense() {
eval printf "regx32%0.s" {1..$1};
}
ddos_attack_mirroring_defense 5
答案 2 :(得分:1)
您可以使用Unix实用程序seq
生成数字范围。
printf "regx32%0.s" $(seq $1)
答案 3 :(得分:0)
在大括号扩展之前,您应该先让变量展开。您可以使用安全eval
来修复:
ddos_attack_mirroring_defense() {
eval "printf 'regx32%0.s' {1..$1}"
}
答案 4 :(得分:0)
实现这一目标的另一种方法:
ddos_attack_mirroring_defense() {
perl -e "print 'regx32'x$1"
}
答案 5 :(得分:0)
使用eval
的更安全的替代方法是
ddos_attack_mirroring_defense() {
printf "regx32"
for ((i=1; i<=$1; i++)); do
printf "%0.s" "$i"
done
}