我在以下简单的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
答案 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"
或者,不要为不同的事情使用相同的变量名称 - 无论如何这可能是一个好主意。