2013-03-06 76 views
0

我试图声明,赋值和调用变量在循环内运行用户定义的时间量。我希望这些变量在循环后可用。我所试图做的是:Bash:声明,赋值给一个变量并在一个循环内调用它

echo "HOW MANY ROUNDS OF TEST ITERATIONS WOULD YOU LIKE TO RUN?" 
read round_nr 
echo "Number of Iteration rounds set to: $round_nr!" 

for r in $(seq 1 $round_nr); do 
    echo "HOW MANY COLD TEST ITERATIONS DO YOU WANT IN ROUND $r?" 
    read COLD$r 
    echo "HOW MANY WARM TEST ITERATIONS DO YOU WANT IN ROUND $r?" 
    read WARM$r 
    echo "HOW MANY HOT TEST ITERATIONS DO YOU WANT IN ROUND $r?" 
    read HOT$r 
    echo "HOW MANY NR OF FIXES PER TEST ITERATION $r?" 
    read NUMFIX$r 
    echo "ITERATION $r INPUT VALUES: COLD/WARM/HOT/NUMFIX:" 
    echo $COLD$r $WARM$r $HOT$r $NUMFIX$r 
done 

这样一来,每环(在用户定义的一组round_nr环路)四个变量将被创建和分配的用户输入值。我打算稍后使用这些变量。

非常感谢您的帮助!

回答

0

你可以使用一个数组(可能是首选的方法),或者你可以做一些eval体操。 bash手册页提供了你需要知道的一切。

2

确实可以使用declare,但使用数组会更容易。 (我用的是-p标志read在这里节省空间。你不需要使用它)

for r in $(seq 1 $round_nr); do 
    read -p "HOW MANY COLD TEST ITERATIONS DO YOU WANT IN ROUND $r?" ans 
    declare "COLD$r=$ans" 
    read -p "HOW MANY WARM TEST ITERATIONS DO YOU WANT IN ROUND $r?" ans 
    declare "WARM$r=$ans" 
    read -p "HOW MANY HOT TEST ITERATIONS DO YOU WANT IN ROUND $r?" ans 
    declare "HOT$r=$ans" 
    read -p "HOW MANY NR OF FIXES PER TEST ITERATION $r?" ans 
    declare "NUMFIX$r=$ans" 
    echo "ITERATION $r INPUT VALUES: COLD/WARM/HOT/NUMFIX:" 

    # Here's the tricky part. It's easier to create the variable than it 
    # is to use it. 
    varcold="COLD$r" 
    varwarm="WARM$r" 
    varhot="HOT$r" 
    varnumfix="COLD$r" 

    echo ${!varcold} ${!varwarm} ${!varhot} ${!varnumfix} 
done 

使用数组,它只是

for r in $(seq 1 $round_nr); do 
    read -p "HOW MANY COLD TEST ITERATIONS DO YOU WANT IN ROUND $r?" cold[r] 
    read -p "HOW MANY WARM TEST ITERATIONS DO YOU WANT IN ROUND $r?" warm[r] 
    read -p "HOW MANY HOT TEST ITERATIONS DO YOU WANT IN ROUND $r?" hot[r] 
    read -p "HOW MANY NR OF FIXES PER TEST ITERATION $r?" numfix[r] 
    echo "ITERATION $r INPUT VALUES: COLD/WARM/HOT/NUMFIX:" 
    echo ${cold[r]} ${warm[r]} ${hot[r]} ${numfix[r]} 
done 

在这两种情况下,变量将所有可用的for循环之后,只要你不做任何事情,使在子shell中for循环运行(如把它放在一个管道或将其包含在(...)等)

+0

谢谢你这么多解释这一点,两者都很好,我学到了新的东西! – Nikl 2013-03-07 09:13:51

+0

我有一个额外的问题,这段代码工作得很好,如果我独立运行它,但是一旦我将它嵌入到脚本中,它将返回一个¨read:cold [r]:错误的变量名称,一旦它到达读取部分,仍然在循环中。它不会在任何子shell或管道中运行,用括号括起来。你是否知道问题可能是什么? – Nikl 2013-03-07 12:26:58

+0

:那是当我运行阵列解决方案。 – Nikl 2013-03-07 12:30:54