Подстановка имен переменных оболочки

По умолчанию postgresql ограничивает соединения для всех ролей. Решение: установить limit в -1 (ulimited) или что-то другое:

ALTER ROLE rep CONNECTION LIMIT -1;

from atlassian

6
19.03.2018, 06:19
4 ответа

Использование :

$ foobar_1=x foobar_2=y foobar_3=z
$ for v in "${!foobar_@}"; do echo "$v"; done

Выход:

foobar_1
foobar_2
foobar_3

'разыменование':

$ for v in "${!foobar_@}"; do echo "${!v}"; done

Выход²:

x
y
z
8
27.01.2020, 20:21

Вместо использования отдельных переменных с именами, начинающимися с B2_, можно использовать ассоциативный массив(B2). например.

Обратите внимание, :следующее относится к zsh. kshи bashтакже имеют ассоциативные массивы, но синтаксис их инициализации и использования отличается (см. ниже ).

typeset -A B2
# initialise array
B2=(ACCOUNT_ID 12345 ACCOUNT_KEY 54321 REPOSITORY somewhere)

# two different ways of adding elements to the array
B2[FOO]=bar
B2+=(NAME fred)             

for key val in ${(kv)B2}; do 
  echo "$key: $val"
done

Вывод для этого примера будет:

ACCOUNT_KEY: 54321
FOO: bar
REPOSITORY: somewhere
ACCOUNT_ID: 12345
NAME: fred

Вы также можете распечатать весь массив (в форме, подходящей для повторного -использования в скрипте или в командной строке )с помощьюtypeset -p:

% typeset -p B2
typeset -A B2=( ACCOUNT_ID 12345 ACCOUNT_KEY 54321 FOO bar NAME fred REPOSITORY somewhere )

Те же операции в kshили Bash будут следующими:

# initialise it
typeset -A B2
B2=([ACCOUNT_ID]=12345 [ACCOUNT_KEY]=54321 [REPOSITORY]=somewhere)

# add elements
B2[FOO]=bar
B2+=([NAME]=fred) 

# get a list of the keys and use them as indexes to get the values
for key in "${!B2[@]}"; do 
  echo "$key: ${B2[$key]}"
done

# print the entire array
typeset -p B2
5
27.01.2020, 20:21

Баш имеет compgen -v.

В Bash вы можете перечислить имена переменных, которые начинаются с B2, используя:

compgen -v B2

Выполнение команды compgen -v textперечисляет те же переменные, которые доступны в качестве результатов автозаполнения, когда вы вводите $, затем text, а затем нажимаете клавишу Tab. (Возможно, вам придется нажать клавишу Tab несколько раз, чтобы отобразить их все. )Вы можете использовать compgen -vв интерактивном режиме, но вы также можете использовать его в скрипте. Например:

$ bash -c 'compgen -v SDK'
SDKMAN_CANDIDATES_DIR
SDKMAN_CURRENT_API
SDKMAN_DIR
SDKMAN_LEGACY_API
SDKMAN_PLATFORM
SDKMAN_VERSION

(Сценарий, конечно, может находиться в файле, а не передаваться в bashв качестве операнда флага -c.)

Целью compgenявляется завершение команд. См. выводhelp compgen(в Bash )для получения общей информации об этом. Хотя это, вероятно, будет делать то, что вы хотите, вы можете обнаружить, что другие подходы, такие как метод расширения параметров в ответе Жиля Кено , более четко выражают то, что вы делаете. Я не могу сказать, что лучше, так как это зависит от того, что вы делаете, и, возможно, также от ваших личных стилистических предпочтений.

4
27.01.2020, 20:21

Сzsh:

for var (${(M)${(k)parameters}:#B2_*})
  printf '$%s == %s\n' $var ${(P)var}
  • ${(k)parameters}— это клавиши специального ассоциативного массива $parameters, дающего информацию обо всех параметрах.
  • ${array:#B2_*}удаляет из расширения $arrayэлементы, соответствующие B2_*. С(M)(для Mприкрепленным ), это перевернутое:сохраняет совпадающие элементы.
  • ${(P)var}(аналогично bash${!var}):расширяется до значения параметра, имя которого хранится в $var.

Если вам нужны только те переменные, которые не экспортируются:

setopt extendedglob # for ^
for var (${(M)${(k)parameters[(R)^*export*]}:#B2_*})
  printf '$%s == %s\n' $var ${(P)var}
2
27.01.2020, 20:21

Теги

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