bash: сопоставление и замена пользовательского ввода другим массивом

В скрипте не следует понижать уровень массива до строки. Переменная окружения и ее значение представляют собой простую пару key=value, где и key, и valueявляются строками. Понижение позиционных параметров до простой строки (путем конкатенации )затруднит сохранение разделения между ними, и будет трудно получить правильное цитирование, когда вы в конечном итоге захотите их использовать.

Вместо этого передайте позиционные параметры (аргумент командной строки ), которые вы хотите передать следующему сценарию в его командной строке.

#!/bin/bash

first_arg=$1
shift

# later...

./my_other_script "$@"

В другом сценарии:

#!/bin/bash

# use "$@" here
foo --bar "$@"
2
09.09.2019, 22:35
2 ответа

Это похоже на работу с ассоциативными массивами bash!

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

$ declare -A packs
$ packs=( [low]='1+1+2' [mid]='2+2+3' [high]='3+3+4' )
$ parameters=${packs[low]}
$ echo $parameters
1+1+2
2
27.01.2020, 22:08

ответ wyrm все хорошо при использовании недавнего выпуска bash, но для выпусков ранее 4.0 (например. в macOS )вам придется полагаться на обычные массивы.

Вот как это можно сделать:

packcontent=('1+1+2' '2+2+3' '3+3+4')
low=0 mid=1 high=2

parameters=${packcontent[mid]}

Значение в $parametersбудет 2+2+3, так как это то, что находится в индексе 1 в packcontent. midне обязательно иметь префикс$("$mid" ), так как индекс массива оценивается в арифметическом контексте.


Для/bin/sh(нет массивов ), возможно, вам сойдет с рук

set -- '1+1+2' '2+2+3' '3+3+4'
low=1 mid=2 high=3

eval "parameters=\$$mid"

То есть список возможных параметров хранится в "$@", а на правильный из них ссылаются с помощью одного из $low, $midили $highпри назначении parameters. Присваивание выполняется с помощью eval, в результате чего для оценки будет получена строка parameters=$n, где nзаменено значением$mid(в данном случае ).

0
27.01.2020, 22:08

Теги

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