Почему мой массив 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 

Почему мой короткий массив не является массивом? Это всего лишь один элемент. Как я могу разделить мой массив, когда результаты будут заполнены на массивах?

Моя версия bashGNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)

  • Попытка подделать двумерный многомерный массив в bash, сохранив имя массива в виде строки
  • Дублирование индексов в массиве
  • Прочитать файл, удалить пробелы и сохранить в массиве
  • суммирование двух матриц, каждый из которых в другом файле
  • Вызов сценария в каждой строке файла
  • Список всех пар слов, которые отображаются в строке вместе в файле
  • Когда переменная массива представляет весь массив и когда элемент индексируется `0`?
  • Как найти файлы на основе массива
  • One Solution collect form web for “Почему мой массив bash всегда имеет длину 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 за помощь в этом.

    Linux и Unix - лучшая ОС в мире.