【问题标题】:Scope of variables in bash scriptbash 脚本中的变量范围
【发布时间】:2016-03-11 07:21:33
【问题描述】:

我在以下简单的 bash 脚本中使用了变量“i”三次,该脚本本质上生成了数组中不存在的随机数。有人可以在这里帮助我了解每个变量的范围吗?

timestamp="9"
researchArea="5"
numberOfDimensions="8"


timeStampToInjectArray=()
dimensionToTamperArray=()
for((i=0;i<$numberOfDimensions;i++))
do     
    echo $i
    while : ;
    do

        timeStampToInject=$(shuf -i 0-$timestamp -n 1)
        dimensionToTamper=$(shuf -i 1-$researchArea -n 1)
        flag=0
        for((i=0;i<${#timeStampToInjectArray[@]};i++))
        do
            echo $i
            if [ "${timeStampToInjectArray[i]}" -eq "$timeStampToInject" ] && [ "${dimensionToTamperArray[i]}" -eq "$dimensionToTamper" ]; then
            flag=1
            fi
        done
        if [ "$flag" -eq "0" ]; then
            break
        fi

    done
    timeStampToInjectArray+=("$timeStampToInject")
    dimensionToTamperArray+=("$dimensionToTamper")
    echo $timeStampToInject,$dimensionToTamper
done

【问题讨论】:

    标签: bash variables scope


    【解决方案1】:

    如果您习惯于 C、C++、Java 等语言,那么您会期望计算出的 for 循环中的计数器具有本地范围。不,不是在 Bash 中。只有一个变量i:

    i='hello sailor'
    
    for ((i=0; i < 5; i++))
    do
        echo "outer:$i"
        for ((i=0; i < 5; i++))
        do
            echo "inner:$i"
        done
    done
    
    echo "final:$i"
    

    给予:

    outer:0
    inner:0
    inner:1
    inner:2
    inner:3
    inner:4
    final:6
    

    Bash(如 Python)在条件句中没有块范围。它在函数中具有本地范围,如果您想在 bash 中构建结构化代码,那么您必须沿着这条路线走。

    例如:

    loop_n_times() {
    
        local i           # <<< locally scoped 
        local limit=$1    # <<< locally scoped
    
        for ((i=0; i < $limit; i++))
        do
            echo "function:$i"
        done
    }
    
    i='hello sailor'
    
    for ((i=0; i < 5; i++))
    do
        echo "outer:$i"
        loop_n_times 5
    done
    
    echo "final:$i"
    

    给予:

    outer:0
    function:0
    function:1
    function:2
    function:3
    function:4
    outer:1
    function:0
    function:1
    function:2
    function:3
    function:4
    outer:2
    function:0
    function:1
    function:2
    function:3
    function:4
    outer:3
    function:0
    function:1
    function:2
    function:3
    function:4
    outer:4
    function:0
    function:1
    function:2
    function:3
    function:4
    final:5
    

    或者,不要为不同的事物使用相同的变量名 - 无论如何这可能是个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多