Bash: цитирование строки внутри массива - PullRequest
0 голосов
/ 25 февраля 2020

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

getdblist_cmd=(sudo -u $backup_user $psql -p $pgsql_port -U $pgsql_user -d postgres -q -t -c 'SELECT datname from pg_database')

# Get databases list
msg
msg "================================================================="
msg "Getting databases list ..."
dblist=`"${getdblist_cmd[@]}"`
status=$?
if [ "$status" -ne "0" ]; then
    return $status
fi

Это работает, но мне нужно исключить базу данных template0, но это не работает:

getdblist_cmd=(sudo -u $backup_user $psql -p $pgsql_port -U $pgsql_user -d postgres -q -t -c 'SELECT datname from pg_database WHERE datname != \'template0\')'

# Get databases list
msg
msg "================================================================="
msg "Getting databases list ..."
dblist=`"${getdblist_cmd[@]}"`
status=$?
if [ "$status" -ne "0" ]; then
    return $status
fi

Возвращает:

root@postgres /u/l/sbin# ./pgsql-backup-full-func.sh
./pgsql-backup-full-func.sh: line 145: unexpected EOF while looking for matching `''
./pgsql-backup-full-func.sh: line 187: syntax error: unexpected end of file

Я знаю, что невозможно исключить одинарные кавычки в Bash, так как мне это сделать?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Прекратите использование массивов, когда вы должны использовать функции.

getdblist_cmd () {
  sudo -u "$backup_user" "$psql" -p "$pgsql_port" -U "$pgsql_user" -d postgres -q -t -c "SELECT datname from pg_database WHERE datname != 'template0'"
}

# Get databases list
msg
msg "================================================================="
msg "Getting databases list ..."
dblist=$(getdblist_cmd)
status=$?
if [ "$status" -ne "0" ]; then
    return $status
fi
0 голосов
/ 25 февраля 2020

Я думаю, у вас есть несколько вариантов -

Использование двойных кавычек

getdblist_cmd=(sudo -u $backup_user $psql -p $pgsql_port -U $pgsql_user -d postgres -q -t -c "SELECT datname from pg_database WHERE datname != 'template0'")

Использование еще одной переменной

sql_query='SELECT datname from pg_database WHERE datname != '\''template0'\'
getdblist_cmd=(sudo -u $backup_user $psql -p $pgsql_port -U $pgsql_user -d postgres -q -t -c $sql_query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...