Резюме
В зависимости от того, что bash или же awk версии, которая у меня есть, я получаю разные результаты, когда пытаюсь разрезать массив, содержащий awk выход. В более старых версиях bash и awk «операция среза» (например, ${a[@]:2}) неправильно возвращает массив с одним элементом независимо от того, сколько элементов осталось в нарезанном массиве. Однако это кажется проблемой только при нарезке массивов, которые «захватывают» awk выход.
MWE
Вы можете запустить следующее, чтобы воспроизвести проблему:
bash array_slice.sh text.fileкуда
array_slice.shиtext.fileследующие:array_slice.shсценарий:#!/usr/bin/env bash defaultIFS=$IFS IFS=$'n' t=($(awk '{ printf("%sn", $0) }' "$1")) printf "nArray 't' has ${#t[@]} elementsn" printf "Elements of array 't':n" printf "%sn" "${t[@]}" t45=( ${t[@]:4} ) printf "nArray 't45' has ${#t45[@]} elementsn" printf "Elements of array 't45':n" printf "%sn" "${t45[@]}"text.file:some text some other text this is text too text above is text and text below is text text text text
Вывод для различных платформ
Обратите внимание, как массив t45 имеет только один элемент в выводе Ubuntu 16.04 (предполагается, что их должно быть два) и как он правильно имеет два элемента в выводе Ubuntu 20.04.
Ubuntu 16.04 с
- GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)
- GNU bash, версия 4.3.48 (1) -release (x86_64-pc-linux-gnu) Дает:
Array 't' has 6 elements Elements of array 't': some text some other text this is text too text above is text and text below is text text text text Array 't45' has 1 elements Elements of array 't45': and text below is text text text textUbuntu 20.04 с
- GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
- GNU bash, версия 5.0.17 (1) -release (x86_64-pc-linux-gnu) Дает:
Array 't' has 6 elements Elements of array 't': some text some other text this is text too text above is text and text below is text text text text Array 't45' has 2 elements Elements of array 't45': and text below is text text text text
