Каким образом можно передать массив в Bash-скрипт?

Как можно передать массив языков (например, ru, en, fr, de, kk, pe и т.д.) в Bash-скрипт в качестве аргумента, если заранее неизвестно количество языков, которое может варьироваться от 5 до 15?
  • 14 ноября 2024 г. 13:53
Ответы на вопрос 3
В Bash можно передать массив как список аргументов в командной строке, и в самом скрипте можно использовать специальные конструкции для работы с этими аргументами. Вот несколько способов, как это сделать.

### Способ 1: Передача как список аргументов

Вы можете передать языки в качестве аргументов командной строки. Например:

```bash
#!/bin/bash

# Сохранение массива в переменной
languages=("$@")

# Вывод массива
for lang in "${languages[@]}"; do
    echo "$lang"
done
```

Запускаем скрипт следующим образом:

```bash
./script.sh ru en fr de kk pe
```

### Способ 2: Передача через строку с разделителем

Другой способ — передать массив как строку с разделителем, например через запятую, и затем разбивать эту строку на массив внутри скрипта:

```bash
#!/bin/bash

# Принятие строки с языками
input="$1"

# Преобразование строки в массив
IFS=',' read -r -a languages <<< "$input"

# Вывод массива
for lang in "${languages[@]}"; do
    echo "$lang"
done
```

Запускаем скрипт следующим образом:

```bash
./script.sh "ru,en,fr,de,kk,pe"
```

### Способ 3: Использование цикла читателя

В этом случае можно передавать языки по одному через стандартный ввод, вызывая скрипт таким образом:

```bash
#!/bin/bash

# Объявляем пустой массив
languages=()

# Чтение языков из стандартного ввода
while read -r lang; do
    languages+=("$lang")
done

# Вывод массива
for lang in "${languages[@]}"; do
    echo "$lang"
done
```

Запускаем скрипт следующим образом, перенаправляя ввод:

```bash
printf "ru\nen\nfr\nde\nkk\npe\n" | ./script.sh
```

### Заключение

Выберите подходящий способ в зависимости от ваших требований. Первый способ проще всего, если не нужно дополнительно форматировать входные данные. Второй способ удобен для передачи данных, разделенных запятыми, а третий полезен, когда массив нужно вводить по строкам.
Переписать этот скрипт на компилируемый язык и не знать проблем.
./test.sh test1 test2 test3

test.sh:
#!/bin/bash
for i in "$@"; do
  echo "$i"
done
Похожие вопросы