Забавный чистый Bash≥4 пути:
cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file
После этого у вас будет массив ary
с первым полем (то есть с индексом 0
), являющимся первой строкой file
, а его последним полем будет последняя строка file
. Обратный вызов cb
(необязательно, если вы хотите удалить все строки в массиве) сбрасывает все промежуточные строки, чтобы не загромождать память. Как бесплатный побочный продукт, у вас также будет количество строк в файле (как последний индекс массива + 1).
Демо-версия:
$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' {a..z})
$ declare -p ary
declare -a ary='([0]="a" [25]="z")'
$ # With only one line
$ mapfile -t -C cb -c 1 ary < <(printf '%s\n' "only one line")
$ declare -p ary
declare -a ary='([0]="only one line")'
$ # With an empty file
$ mapfile -t -C cb -c 1 ary < <(:)
declare -a ary='()'
wc -l
не имеет ничего общего с выводом последней строки файла.