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

时间:2011-03-27 04:48:13

标签: bash

我非常擅长打击脚本,我试图通过制作一个只需要一系列数字的小脚本来练习。我会输入前。 5..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

4 个答案:

答案 0 :(得分:15)

  1. bash中的brace扩展不会扩展参数(与zsh不同)
  2. 您可以通过使用eval和命令替换$()
  3. 来解决这个问题
  4. eval是邪恶的,因为您需要清理输入,否则人们可以输入rm -rf /;eval之类的范围
  5. 请勿使用function关键字,它不是POSIX且已被弃用
  6. 使用read的{​​{1}}标志代替echo
  7. 但是,出于学习目的,您可以这样做:

    -p

    注意:在这种情况下,使用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'范围

答案 1 :(得分:6)

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

for i in $(eval echo {0..$range}); do echo $i; done

另一种方法是使用bash的C风格for循环

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

最后一个比第一个更快(例如,如果你有$ range&gt; 1 000 000)

答案 2 :(得分:5)

解决缺乏扩展的一种方法,并跳过eval的问题是使用命令替换和seq。

重写函数(也避免使用全局变量):

function func_print_range
{
     for n in $(seq $1 $2); do
     echo $n
     done
}

func_print_range $start $end

答案 3 :(得分:-1)

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