Вещь Toggle/macro/xargs-like для переменных оболочки

Забавный чистый 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='()'
1
17.05.2014, 08:41
2 ответа
[1130112] Вы, кажется, несколько смущены тем, что является переменной оболочки, а что нет. Все переменные в вашей заметке - это переменные окружения, а не оболочки. Установка переменной оболочки:

Link to Previous

Установка переменной окружения:

(или setenv в c shells). Но в

назначение имеет интуитивно понятное значение, отличное от предыдущего, и устанавливает переменную окружения только в окружении команды. Тем не менее, этот простой скрипт должен ответить на ваш вопрос:

Что касается бонусного вопроса: Я не думаю, что Бэш сможет это сделать, но zsh - это потрясающе, и он может это сделать. И

и

имеют один и тот же эффект, и для вашего конкретного примера:

vlc --fullscreen

2
27.01.2020, 23:28
[1168226] В псевдоним можно помещать присваивания переменных.

Пробел в конце переменных говорит оболочке, что для разложения псевдонима можно рассматривать и последующие слова. Например, если [1168574]a[1168575] является псевдонимом для [1168576]somecommand --option[1168577], то [1168578]shellvars1 shellvars2 wibble[1168579] запускает [1168580]FOO=bar BAZ=qxt somecommand --option a[1168581].

Вы также можете использовать функции. Используйте псевдонимы, если назначения фиксированы, и функции, если вы хотите большей гибкости (например, условные назначения).

Вы также можете сделать переменные локальными для функции. Если переменная является локальной для функции, то директива [1168582]export[1168583] также ограничивается областью действия функции.

1
27.01.2020, 23:28

Теги

Похожие вопросы