Bash 使用{$var}在for循环中进行变量替换

Bash 使用{$var}在for循环中进行变量替换,bash,Bash,我对bash脚本非常陌生,我正在尝试通过制作这个只需要一系列数字的小脚本来进行练习。我会输入ex5..20,它应该打印范围,但是-它只是回显我输入的内容(在本例中为“5..20”),并且不会扩展变量。有人能告诉我我做错了什么吗 脚本: echo -n "Enter range of number to display using 0..10 format: " read range function func_printrage { for n

我对bash脚本非常陌生,我正在尝试通过制作这个只需要一系列数字的小脚本来进行练习。我会输入ex5..20,它应该打印范围,但是-它只是回显我输入的内容(在本例中为“5..20”),并且不会扩展变量。有人能告诉我我做错了什么吗

脚本:

    echo -n "Enter range of number to display using 0..10 format: "
    read range

    function func_printrage
    {
         for n in {$range}; do
         echo $n
         done
    }

func_printrange

使用
${}
进行变量扩展。在您的情况下,它将是${range}。您在${}中省略了$,它用于变量扩展和替换

  • bash中的大括号扩展不扩展参数(与zsh不同)
  • 您可以通过使用
    eval
    和命令替换
    $()
  • eval
    是邪恶的,因为你需要净化你的输入,否则人们可以输入像
    rm-rf/这样的范围
    eval
    将运行该命令
  • 不要使用
    函数
    关键字,它不是POSIX,已被弃用
  • 使用
    read
    -p
    标志代替echo
  • 但是,出于学习目的,您可以这样做:

    read -p "Enter range of number to display using 0..10 format: " range
    
    func_printrange()
    {
      for n in $(eval echo {$range}); do
        echo $n
      done
    }
    
    func_printrange
    

    注意:在这种情况下,使用
    eval
    是可以的,因为您只是在
    echo
    范围内

    一种方法是使用
    eval
    , 粗略的例子

    for i in $(eval echo {0..$range}); do echo $i; done
    
    另一种方法是使用bash的C风格
    进行循环

    for((i=1;i<=20;i++))
    do
      ...
    done
    

    for((i=1;i 1000000)

    绕过扩展不足的一种方法,跳过eval的问题是使用命令替换和seq

    返工功能(也避免全局):


    不过,感谢您的评论-我不想在子shell中执行命令。我想将$range变量替换为“for n in”循环,因此本质上它变成:“for n in{5..20};do”@ZDRuX啊,我明白了,更正了我的答案。你忘了用$来启动变量扩展。-1,这并不能回答问题。他说的是支架扩展而不是变量扩展。谢谢你,它现在起作用了!使用“函数”有什么错?是否有我应该使用的替代方法?@ZDRuX:
    函数
    不是POSIX,即它不可移植。至于替代方法,请参阅我的代码。使用eval绝对不安全。请尝试输入
    1..5$(ls)
    。不能用这种方式替换变量:
    。。。;i@karatedog正确,但您并没有真正提供帮助。正确的用法是使用变量名,但不带前缀:
    for((i=begin;i
    
    function func_print_range
    {
         for n in $(seq $1 $2); do
         echo $n
         done
    }
    
    func_print_range $start $end