Забавный чистый Bash≥4 способ:
cb() { (($1-1>0)) && unset "ary[$1-1]"; }
mapfile -t -C cb -c 1 ary < file
После этого у вас будет массив ary
с первым полем (т.е, где индекс 0
) является первой строкой файла ary
, а его последнее поле - последней строкой файла ary
. Обратный вызов cb
(опционально, если вы хотите перекрыть все строки в массиве) сбрасывает все промежуточные строки, чтобы не загромождать память. В качестве свободного побочного продукта в файле также будет указано количество строк (как последний индекс массива+1).
Demo:
$ 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='()'
(или setenv в c shells). Но в
назначение имеет интуитивно понятное значение, отличное от предыдущего, и устанавливает переменную окружения только в окружении команды. Тем не менее, этот простой скрипт должен ответить на ваш вопрос:
Что касается бонусного вопроса: Я не думаю, что Бэш сможет это сделать, но zsh - это потрясающе, и он может это сделать. И
имеют один и тот же эффект, и для вашего конкретного примера:vlc --fullscreen
Пробел в конце переменных говорит оболочке, что для разложения псевдонима можно рассматривать и последующие слова. Например, если [1168574]a[1168575] является псевдонимом для [1168576]somecommand --option[1168577], то [1168578]shellvars1 shellvars2 wibble[1168579] запускает [1168580]FOO=bar BAZ=qxt somecommand --option a[1168581].
Вы также можете использовать функции. Используйте псевдонимы, если назначения фиксированы, и функции, если вы хотите большей гибкости (например, условные назначения).
Вы также можете сделать переменные локальными для функции. Если переменная является локальной для функции, то директива [1168582]export[1168583] также ограничивается областью действия функции.