【问题标题】:Bash: declare, assign value to a variable and call it inside a loopBash:声明,为变量赋值并在循环中调用它
【发布时间】:2013-03-06 16:21:08
【问题描述】:

我试图在一个循环中声明、赋值和调用变量,该循环运行用户定义的次数。我希望这些变量在循环后可用。我想做的是:

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 循环中),将创建四个变量并分配用户输入值。我计划稍后使用这些变量。

非常感谢您的帮助!

【问题讨论】:

    标签: bash variables for-loop ubuntu-12.04


    【解决方案1】:

    您确实可以使用declare,但使用数组会容易得多。 (我在这里为read 使用-p 标志以节省空间;您不需要使用它。)

    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 循环之后可用,只要您不做任何事情来使 for 循环在子外壳中运行(例如将其放入管道中或将其封闭)在(...)等)

    【讨论】:

    • 非常感谢您解释这一点,两者都工作得很好,而且我学到了新东西!
    • 我还有一个问题,如果我独立运行这段代码,它运行得很好,但是一旦我将它嵌入到我的脚本中,它就会返回一个“读取:冷[r]:错误的变量名”错误一旦它到达读取部分,仍然在循环内。它不在任何子外壳或管道中运行,也没有用括号等括起来。你知道问题可能是什么吗?
    • :那是我运行数组解决方案的时候。
    • 您的脚本顶部有#!/bin/bash 吗?如果没有,您可能正在使用不支持数组的 sh 运行脚本。
    • 我认为我的脚本中还有其他错字。我重写了,效果很好。非常感谢!
    【解决方案2】:

    您可以使用数组(可能是首选方法),或者您可以做一些eval 体操。 bash 手册页包含您需要知道的所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 2022-11-08
      相关资源
      最近更新 更多