$ set -f # disable globbing
$ arr=($(<file.csv))
$ set +f # enable globbing
$ declare -p arr # print array content
declare -a arr=([0]="UserName" [1]="UserName" [2]="UserName")
arr=(…)
создать массив $(<file.csv)
прочитать файлfile.csv
(как$(cat file.csv)
)Перед чтением файла необходимо отключить подстановку, чтобы предотвратить расширение имен пользователей такими символами, как *
или ?
или специальными шаблонами (расширение имени пути ).
Элементы разделяются символами новой строки, пробела или табуляции (при условии, что $IFS
не были изменены )и не обрезаны.
Прочитайте файл JSON локально, а затем установите соединение SSH. Кроме того, больше не требуется, чтобы jq
был доступен в удаленной системе.
Ваш скрипт:
#!/bin/sh
set -u -e
wget 'https://raw.githubusercontent.com/dokku/dokku/v0.25.7/bootstrap.sh'
sudo DOKKU_TAG=v0.25.7 bash bootstrap.sh
sudo dokku plugin:install 'https://github.com/dokku/dokku-postgres.git' postgres
dokku postgres:create "$DB_NAME"
dokku postgres:link "$DB_NAME" "$APP_NAME"
# use the Backup IAM profile
dokku postgres:backup-auth \
"$DB_NAME" \
"$AWS_BACKUP_ACCESS" \
"$AWS_BACKUP_SECRET" \
"$AWS_DEFAULT_REGION"
Запуск:
ssh root@remotehost "env $( jq -r 'to_entries | map("\(.key)=\(.value)") | @sh' /home/project/env.json ) sh -s" <dokku.sh
Это вызывает env
в удаленной системе со списком переменных среды и их значениями в качестве аргументов. В конце списка аргументов находится sh -s
, который прочитает ваш dokku.sh
скрипт и выполнит его (скрипт не использует башизмы, поэтому нет необходимости вызывать более продвинутую оболочку ).
Я также использую set -u
в скрипте, чтобы он завершал работу при обнаружении неустановленной переменной, и set -e
для завершения при любой ошибке.
Очевидно, вы могли бы обернуть бит вызоваssh
-в локальный сценарий или использовать что-то вроде Ansible, чтобы сделать все это более надежно.