我正在从一个文件创建一个数组,但我注意到如果我没有初始化一个变量并使用它,那么它也可以正常工作。就像我的代码是:
while read line
do
array[i]="$line"
i=$i+1
done < file
这里我想知道'i'的值是如何用零初始化的,即使我没有初始化它的值。
答案 0 :(得分:1)
首先让我告诉你,这不符合你的期望。 bash中的未初始化变量将根据上下文进行评估。到0
预期数字;到期望字符串的an empty string
。在这种情况下......
i=$i+1
实际上是一个字符串连接。整个事情无论如何都有用,因为+1
与+1+1
不同等等。你的意思可能就是这样:
: $((++i))
或者这个:
i=$((i + 1))
但无论如何,使用未初始化的变量只是一种不好的做法。它在单行中很有用,写i=0
或i=""
是不必要的负担,但在脚本中我会在开头使用set -u
来捕获所有实例。
答案 1 :(得分:1)
i
尚未初始化为零,但its reference value evaluates to zero:
如果变量为空(null)或未设置,则其引用的计算结果为0.
在下一行i=$i+1
中,变量被替换为其值(空),导致i=+1
,结果等于1.
所以它主要是偶然的,但在这种情况下会导致预期的结果。
将来,我建议使用set -u
以避免意外使用未初始化的变量。