LINUX.ORG.RU
решено ФорумAdmin

Что это такое и как с этим бороться? [bash-скрипт]

 


0

1

Если я выполю какой то код в сеансе терминала, он отработает. Но совсем нет гарантии что он будет работать так же в сценарии, и тем более при запуске например через cron.

С кроном все можно разрулить, сейчас не пойму вот что:

root@PostgreSQL:/home/maintainer/rdiff_test# wegasgasdfg="$(ls /incrimental/bis_kamin55_psql | grep -E "^bis_kamin55_psql.*2020-12-04.*(.delta|.dump.gz)$")"
root@PostgreSQL:/home/maintainer/rdiff_test# echo $wegasgasdfg
bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-00.dump.delta bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-06.dump.delta bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-10.dump.delta bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-14.dump.delta bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-18.dump.delta bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-22.dump.delta

Вроде все хорошо. Но теперь делаю так:

root@PostgreSQL:/home/maintainer# cat /root/do_restore.sh
#!/bin/bash -x

PORT=5433
USERNAME='dbadmin'
SERVERNAME='localhost'
ARCHIVEDIR='/incrimental'
NEWDBNAME='';
OLDDBNAME='';
ARCHIVEDATE='';

if [[ $1 != '' ]]
then
    NEWDBNAME=$1
else
    echo "Enter new DB name as first parametr"
    exit
fi

if [[ $2 != '' ]]
then
    OLDDBNAME=$2
else
    echo "Enter DB name in archive"
    exit
fi

if [[ $3 != '' ]]
then
    ARCHIVEDATE=$3
else
    echo "Enter date in forman YYYY-mm-dd"
    exit
fi

#arr=( "$(ls $ARCHIVEDIR/$OLDDBNAME | grep -E "^$OLDDBNAME.*$ARCHIVEDATE.*(.dump.gz.delta|.dump.gz)\$")" )
#arr=( "$(ls /incrimental/bis_kamin55_psql | grep -E \"^bis_kamin55_psql.*2020-12-04.*(.delta|.dump.gz)\$\")" )
aaa="$(ls /incrimental/bis_kamin55_psql | grep -E "^bis_kamin55_psql.*2020-12-04.*(.delta|.dump.gz)\$")"


echo "$aaa"

echo $DBNAME

if psql -U $USERNAME -h $SERVERNAME -p $PORT -lqt | cut -d \| -f 1 | grep -qw $DBNAME
then
    echo "Database with this name exists on this cluster"
    exit
fi


echo -n "Restore database? (Y/n) "

read answer
case "$answer" in
    Y)
        psql -U $USERNAME -h $SERVERNAME -p $PORT -c 'create database '$DBNAME -d postgres
        if file $DUMPGZ | grep -qw "PostgreSQL custom database dump"
        then
            pg_restore -h $SERVERNAME -U $USERNAME -p $PORT -d $DBNAME -w -Fc $DUMPGZ
        else
            gunzip < $DUMPGZ | psql -h $SERVERNAME -U $USERNAME -p $PORT -d $DBNAME
        fi
        ;;
    *) exit 0
        ;;

При запуске получаем какой то выхлоп от grep

root@PostgreSQL:/home/maintainer# /root/do_restore.sh newdbname bis_kamin55_psql 2020-12-03
bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-00.dump.delta
bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-06.dump.delta
bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-10.dump.delta
bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-14.dump.delta
bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-18.dump.delta
bis_kamin55_psql_Ii4Ekongaew9jie_daily_2020-12-04-22.dump.delta

Использование: grep [ПАРАМЕТР]… ШАБЛОН [ФАЙЛ]…
Запустите «grep --help» для получения более подробного описания.
Restore database? (Y/n)

Что поменялось?



Последнее исправление: alpha (всего исправлений: 1)

Ответ на: комментарий от Bad_ptr

а вообще разобрался… всем спасибо. Аноним, я учусь… и многое умею… но всегда есть что выучить нового.

Shulman
() автор топика

#!/bin/bash -x и выхлоп не соответствуют друг другу.

Тебе нельзя помочь

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

подскажи, последний вопрос по этому кейсу, почему в примере из командной строки переменная разделяет строки пробелами, а в последнем как список?

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

возможно протому что в командной строке ты написал переменную не взяв её в «строковые кавычки»

Bad_ptr ★★★★★
()

wegasgasdfg=«$(ls /incrimental/bis_kamin55_psql | grep -E «^bis_kamin55_psql.2020-12-04.(.delta|.dump.gz)$»)»

Есть вещи, за которые убивать надо; ls | grep, да еще и в скрипте — одна из них.

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

я конечно не эксперт, но

aaa="$(ls /incrimental/bis_kamin55_psql | grep -E "^bis_kamin55_psql.*2020-12-04.*(.delta|.dump.gz)\$")"

это смотрится как минимум странно.

и вообще, зачем что то писать на помойном баше, если есть питон который «учат в школе»?

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

короче логика там такая, если ты пишешь
var = «1
2 3»

echo $var

то перед запуском баш подставляет значение переменной в строку команды, при этом получается

echo 1 2 3

первое «слово» в строке затем считается командой, а последующие — аргументами разделёнными пробельными символами(т.е. не обязательно пробелами, а новой строкой и т.д.)
получается вызов команды с тремя отдельными аргументами

А если ты пишешь
echo «$var»
то вызов происходит с одним аргументом, причём аргумент передаётся единой строкой «как есть» (со всеми спецсимволами и новыми строками)

echo «1
2 3»

Bad_ptr ★★★★★
()

Что поменялось?

NEWDBNAME=$1
OLDDBNAME=$2
...
grep -qw $DBNAME

В том и дело, что ничего не поменялось. Совсем ничего!

anonymous
()

тебе лишь бы не работать, хитрый жук.

anonymous
()

запустите «grep –help» для получения более подробного описания.

Ты знаешь, что русский язык на серверах отдельный котел в аду?

constin ★★★★
()

ARCHIVEDIR='/incrimental'

Вон. Из. Профессии. Остальное даже нет смысла разбирать, за какой-нибудь if file принято, конечно, бить по рукам раскалённой кочергой, но это применимо только к тем, кто останется в профессии .

gremlin_the_red ★★★★★
()
Ответ на: комментарий от constin

Справедливости ради, на серверах с 1с и патченным под 1с постгресом (а у ТС именно такая конфигурация), это не так уж и неправильно.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от dexpl

Злой ты. Оскопить ржавой тупой ножовкой вполне достаточно.

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