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

ZDR*_*RuX 7 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
Run Code Online (Sandbox Code Playgroud)

Sie*_*geX 15

  1. bash中的brace扩展不会扩展参数(与zsh不同)
  2. 您可以通过使用eval和命令替换来解决这个问题$()
  3. eval是邪恶的,因为你需要消毒你的输入,否则人们可以输入范围rm -rf /;,eval并将运行
  4. 不要使用function关键字,它不是POSIX并且已被弃用
  5. 使用read-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
Run Code Online (Sandbox Code Playgroud)

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

  • 使用eval绝对不安全.尝试输入"1..5 $(ls)". (4认同)

kur*_*umi 7

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

for i in $(eval echo {0..$range}); do echo $i; done
Run Code Online (Sandbox Code Playgroud)

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

for((i=1;i<=20;i++))
do
  ...
done
Run Code Online (Sandbox Code Playgroud)

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


Mor*_*gen 5

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

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

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

func_print_range $start $end
Run Code Online (Sandbox Code Playgroud)