为什么我的 bash 数组在拆分时长度始终为 1?

为什么我的 bash 数组在拆分时长度始终为 1?
# Create array
arrayLong=(one two three four)
for element in "${arrayLong[@]}"
do
    echo "$element"
done
echo "${#arrayLong[@]}"

输出:

one
two
three
four
4

然后:

# Make new array with only first half of values
arrayShort=("${arrayLong[@]:0:2}")
for element in "${arrayShort[@]}"
do
    echo "$element"
done
echo "${#arrayShort[@]}"

这个的输出是

one two
1

为什么我的短数组实际上不是一个数组?这只是一个元素。当数组中的结果已满时,如何拆分数组?

我的 bash 版本是GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)

答案1

我不知道IFS使用后不会自动重置。在代码的前面,我设置了IFS=$'\n'而不存储原始值。这是我应该做的:

# set Internal Field Separator to new line only to split files
oIFS="$IFS"
IFS=$'\n'
array=(${all_files})
# Return IFS to initial value
IFS="$oIFS"

要仔细检查IFS给定时刻的内容,请尝试printf "%q\n" "$IFS".默认值应该是$' \t\n'

感谢@MiniMax 和@Jesse_b 对此提供的帮助。

相关内容