Как сдвинуть массив bash на некоторый индекс посередине?

Проверьте эту ссылку:

https://faq.i3wm.org/question/5312/how-to-toggle-onoff-external- and-internal-monitors.1.html

Сценарий написан на bash и также дает инструкции по установке сочетания клавиш в конфигурационном файле i3.

12
19.09.2017, 14:11
1 ответ

bashмассивы, подобные ksh, на самом деле не являются массивами, они больше похожи на ассоциативные массивы с ключами, ограниченными положительными целыми числами (или так называемыми разреженными массивами). Для оболочки с реальными массивами вы можете взглянуть на такие оболочки, как rc, es, fish, yash,zsh(или даже csh/tcsh, хотя у этих оболочек так много проблем их лучше избегать ).

Вzsh:

a=(1 2 3 4 5)
a[3]=() # remove the 3rd element
a[1,3]=() # remove the first 3 elements
a[-1]=() # remove the last element

(Обратите внимание, что в zsh unset 'a[3]'фактически устанавливает пустую строку для улучшения совместимости сksh)

вyash:

a=(1 2 3 4 5)
array -d a 3 # remove the 3rd element
array -d a 1 2 3 # remove the first 3 elements
array -d a -1 # remove the last element

вfish(не борновская -подобная оболочка в отличие от bash/zsh):

set a 1 2 3 4 5
set -e a[3] # remove the 3rd element
set -e a[1..3] # remove the first 3 elements
set -e a[-1] # remove the last element

вes(на основе rc, а не Борна -как)

a = 1 2 3 4 5
a = $a(... 2 4...) # remove the 3rd element
a = $a(4...) # remove the first 3 elements
a = $a(... `{expr $#a - 1}) # remove the last element
# or a convoluted way that avoids forking expr:
a = $a(... <={@{*=$*(2...); return $#*} $a})

в kshиbash

Вы можете использовать массивы как обычные массивы, если вы:

a=("${a[@]}")

после каждой операции удаления или вставки, которая могла привести к тому, что список индексов не является непрерывным или не начинается с 0. Также обратите внимание, что массивы ksh/bashначинаются с 0, а не с 1 (, за исключением$@(некоторым образом )).

Это приведет к очистке элементов и перемещению их к индексу 0, 1, 2... последовательно.

Также обратите внимание, что вам нужно указать number[i]в :

.
unset 'number[i]'

В противном случае это будет эффективно запускать unset numberi, если в текущем каталоге есть файл с именем numberi.

6
27.01.2020, 19:54

Теги

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