Bash函数参数不适用于范围

时间:2014-07-29 07:07:37

标签: bash function

我正在尝试使用范围进行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}

我在这里做错了什么,我该如何解决?

6 个答案:

答案 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
}