bash脚本中的变量范围

时间:2016-03-11 07:21:34

标签: bash variables scope

我在以下简单的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

1 个答案:

答案 0 :(得分:1)

如果您习惯使用C,C ++,Java等语言,那么您将期望计算出的typedef struct node { void* dataptr; struct node* next; } QUEUE_NODE; typedef struct { QUEUE_NODE* front; QUEUE_NODE* rear; int count; }QUEUE; //createqueue QUEUE* createQueue(void) { QUEUE* queue; queue = (QUEUE*)malloc(sizeof(QUEUE)); if (queue) { queue->front = NULL; queue->rear = NULL; queue->count = 0; } return queue; } //Enqueue bool enqueue(QUEUE* queue, void* itemptr) { QUEUE_NODE* newptr; if (!(newptr = (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE)))) return false; newptr->dataptr = itemptr; newptr->next = NULL; if (queue->count == 0) queue->front = newptr; else queue->rear->next = newptr; (queue->count)++; queue->rear = newptr; printf("inserted value is%d\n", newptr->dataptr); return true; } 循环中的计数器具有本地范围。不,不是在Bash。只有一个变量for

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"

Bash(像Python一样)在条件句中没有块范围。它在函数中具有局部范围,如果你想在bash中构建结构化代码,那么你必须沿着这条路走下去。

例如:

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

给出:

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"

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