Как перебирать несколько массивов и элементов bash, которые ранее не сохранялись как переменные?

В RHEL 5 я использую git -1.8.2.3 -1.el5 из Epel 5:

# rpm -qi git
Name        : git                          Relocations: (not relocatable)
Version     : 1.8.2.3                           Vendor: Fedora Project
Release     : 1.el5                         Build Date: Di 26 Apr 2016 19:30:16 CEST

Кажется, требуется OpenSSL 1:

# ldd /usr/bin/git-remote-https
    libssl.so.10 => /lib/libssl.so.10 (0x00b2a000)
    libcrypto.so.10 => /lib/libcrypto.so.10 (0x00595000)

В моей системе это решается следующим:

# rpm -qf /lib/libssl.so.10
openssl1-1.0.1e-57.el5_11

А этот взят из "Tuxad Repo" :https://unix.stackexchange.com/a/459187/284960

У меня нет проблем с клонированием с github.

1
23.07.2020, 20:45
1 ответ

Итак, поговорим об этом:

$ seq1="$(seq -f "number-%g" 0 4)"
$ seq2="$(seq -f "number-%g" 5 9)"
$ elem="number-10"
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]=$'number-0\nnumber-1\nnumber-2\nnumber-3\nnumber-4' [1]=$'number-5\nnumber-6\nnumber-7\nnumber-8\nnumber-9' [2]="number-10")
$ for e in $all; do echo $e; done
number-0
number-1
number-2
number-3
number-4

Обратите внимание declare -p--, что это очень удобно для проверки содержимого переменных.

allявляется массивом . Когда вы разыменовываете это как $all, вы фактически выполняете ${all[0]}--, то есть только извлекаете первый элемент .

Видите, массив allсостоит только из 3 элементов? Переменные seq1и seq2являются не массивами , а простыми "скалярными" переменными. Как и в предыдущем абзаце, вы можете использовать синтаксис элемента массива для ссылки на скалярные переменные :

.
$ x="hello world"
$ declare -p x
declare -- x="hello world"
$ echo "$x"
hello world
$ echo "${x[0]}"
hello world
$ echo "${x[1]}"

$ echo "${x[*]}"
hello world
$ echo "${x[@]}"
hello world

Если вы хотите выполнить внешнюю команду и захватить строк вывода , используйте команду mapfile. Вам также необходимо использовать подстановку процесса для вызова внешней команды.

$ unset seq1 seq2 all
$ mapfile -t seq1 < <(seq -f "number-%g" 0 4)
$ mapfile -t seq2 < <(seq -f "number-%g" 5 9)
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")
$ printf "%s\n" "${all[@]}"
number-0
number-1
number-2
number-3
number-4
number-5
number-6
number-7
number-8
number-9
number-10

Чтобы сгенерировать эту последовательность в bash без использования каких-либо внешних инструментов, используйте Brace Expansion:

$ all=( "number-"{0..10} )
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")
2
18.03.2021, 23:17

Теги

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