LINUX.ORG.RU

Странный вопрос по bash

 


0

2

#!/bin/sh

FILENAME='/root/psql_dblist'
PORT=5433
USERNAME='dbadmin'
SERVERNAME='localhost'
ARCHIVEDIR='/Backup'
SUFFIX=''

echo $1

if [[ 'dayly' = $1 ]]
then
    #SUFFIX=$(date +%u)
    #echo $SUFFIX
    echo Ok
fi

Результат выполнения

root@PostgreSQL:/home/maintainer# /root/backup_test.sh dayly
dayly
/root/backup_test.sh: 12: /root/backup_test.sh: [[: not found

не могу понять в чем дело, вроде все как тут написано:

https://coder-booster.ru/learning/linux-beginners/conditional-operator-if-in-...

Сожалею, но bash всегда обходил и писал на mono, но чувствую это очень плохая практика.


Ответ на: комментарий от TeopeTuK
root@PostgreSQL:/home/maintainer# psql -U dbadmin -p 5433 -l
                                      Список баз данных
        Имя        | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа
-------------------+----------+-----------+-------------+-------------+-----------------------
 ds38_kamin55_psql | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 ds71_kamin55_psql | dbadmin  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 ds7_kamin55_psql  | dbadmin  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 postgres          | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 sm                | dbadmin  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 template0         | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
                   |          |           |             |             | postgres=CTc/postgres
 template1         | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
                   |          |           |             |             | postgres=CTc/postgres
(7 строк)



имею вот такой вывод из которого нужно распарсить список именно баз данных.

но когда делаю


DBLIST=$(psql -U $USERNAME -p $PORT -l);

echo $DBLIST > $FILENAME

получаю все в одну строку, как быть?

Shulman
() автор топика
Ответ на: комментарий от Shulman

Вообще в файл выводить не обязательно, но пока вот проблема того что «построчная» обработка не пройдет

Shulman
() автор топика
Ответ на: комментарий от Shulman
psql -U "$USERNAME" -p "$PORT" -l > "$FILENAME"

ну или если файл не обязателен

psql -U "$USERNAME" -p "$PORT" -l | "$COMMAND_TO_PARSE_OUTPUT_OR_DOING_SOMETHING_ELSE"

Deleted
()
Ответ на: комментарий от Shulman

$ output=`cat <<EOF | q -d'|' "select c1 from - where c1 <> '' and c2 <> '' limit 1,10000"  
                                      Список баз данных
        Имя        | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа
-------------------+----------+-----------+-------------+-------------+-----------------------
 ds38_kamin55_psql | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 ds71_kamin55_psql | dbadmin  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 ds7_kamin55_psql  | dbadmin  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 postgres          | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 sm                | dbadmin  | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |
 template0         | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
                   |          |           |             |             | postgres=CTc/postgres
 template1         | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
                   |          |           |             |             | postgres=CTc/postgres
(7 строк)


EOF
`
$ echo $output
ds38_kamin55_psql ds71_kamin55_psql ds7_kamin55_psql postgres sm template0 template1
anonymous
()

Оператор [[ специфичен для баа, в POSIX sh вместо него [

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от Deleted
root@PostgreSQL:/home/maintainer# psql -U dbadmin -p 5433 -d pg_database -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;"
psql: ВАЖНО:  база данных "pg_database" не существует

подумал может база называется postgres

root@PostgreSQL:/home/maintainer# psql -U dbadmin -p 5433 -d postgres -t -c "SELECT datname FROM postgres WHERE datistemplate = false;"
ОШИБКА:  отношение "postgres" не существует
СТРОКА 1: SELECT datname FROM postgres WHERE datistemplate = false;


Где ошибка?

Shulman
() автор топика
Ответ на: комментарий от Shulman

А чего там разбираться? q это алиас к программе q-text-as-data, которая позволяет делать sql запросы к тексту.

anonymous
()
Ответ на: комментарий от anonymous

С трудом в этом разбираюсь, спасибо, так уже понятнее, а как будет выглядеть команда полностью?

output=$(cat <<EOF | psql -U "$USERNAME" -p 5433 -l | q -d'|' "select c1 from - where c1 <> '' and c2 <> '' limit 1,10000"
EOF)
Shulman
() автор топика
Ответ на: комментарий от Shulman

root@PostgreSQL:/home/maintainer# cat /root/test.sh
#!/bin/bash

output=$(cat <<EOF | psql -U dbadmin -p 5433 -l | q -d'|' "select c1 from - where c1 <> '' and c2 <> '' limit 1,10000"
EOF)

echo "$output"


root@PostgreSQL:/home/maintainer# /root/test.sh
/root/test.sh: строка 6: предупреждение: блок here-document в строке 5 разделён знаком конца файла (ожидался «EOF»)
/root/test.sh: строка 4: q: команда не найдена


Shulman
() автор топика
Ответ на: комментарий от Shulman

cat << EOF нужен только мне, т.к. у меня posgres нету. У тебя будет просто

output=$(psql -U dbadmin -p 5433 -l | q -d'|' "select c1 from - where c1 <> '' and c2 <> '' limit 1,10000")

c1,c2... Это номера колонок. -d'|' это объявление разделителя. Ну и простой sql.

Можно было обойтись cut, но в выводе много хлама всякого.

anonymous
()
Ответ на: комментарий от Shulman

вот так через cut:

egrep '^ [a-z]' | cut -d'|' -f1

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.