diesel@indie:~$ DATABASES="1 2 3" bash 0.sh
0.sh: line 9: unexpected EOF while looking for matching ``'
0.sh: line 20: syntax error: unexpected end of file
попробуй так:
...
for DATABASE in "$DATABASES"; do
...
ещё, насколько я понимаю, имелось в виду:
...
DUMPNAME=${DATABASE}_${TYPE}_`date '+%H%M%S'`.dmp
...
или же лучше так:
DUMPNAME="$DATABASE"_"$TYPE"_`date '+%H%M%S'`.dmp
Вообще желательно переменные в скобки заключать. В таком случае, если даже они содержат пробелы, всё равно будут интерпритироваться как одно слово, а не несколько.
Update:
Чего-то я прогнал. Извиняюсь. Чего-то я прогнал. Извиняюсь. Не проснулся ещё.
попробуй так:
...
for DATABASE in "$DATABASES"; do
...
ещё, насколько я понимаю, имелось в виду:
...
DUMPNAME=${DATABASE}_${TYPE}_`date '+%H%M%S'`.dmp
...
или же лучше так:
DUMPNAME="$DATABASE"_"$TYPE"_`date '+%H%M%S'`.dmp
Вообще желательно переменные в скобки заключать. В таком случае, если даже они содержат пробелы, всё равно будут интерпритироваться как одно слово, а не несколько.
Чего-то я прогнал. Извиняюсь. Чего-то я прогнал. Извиняюсь. Не проснулся ещё.
ребятки.... код в цикле вполне рабочий.... я же и объясняю... если for убрать то все работает....
попробуй так:
...
for DATABASE in "$DATABASES"; do
Вообще желательно переменные в скобки заключать. В таком случае, если даже они содержат пробелы, всё равно будут интерпритироваться как одно слово, а не несколько.
в изначальном for'е в DATABASE не могло быть пробелов, потому что собственно они разделителем и являются, в том который тут:
вся переменная DATABASES попадет в DATABASE как одно целое - не уверен что это надо топикстартеру. если предусмотрены пробелы, то лучше разделителем считать перевод строки и использовать while
попробуй так:
...
for DATABASE in "$DATABASES"; do
Вообще желательно переменные в скобки заключать. В таком случае, если даже они содержат пробелы, всё равно будут интерпритироваться как одно слово, а не несколько.
в изначальном for'е в DATABASE не могло быть пробелов, потому что собственно они разделителем и являются, в том который тут:
вся переменная DATABASES попадет в DATABASE как одно целое - не уверен что это надо топикстартеру. если предусмотрены пробелы, то лучше разделителем считать перевод строки и использовать while
ребятки.... код в цикле вполне рабочий.... я же и объясняю... если for убрать то все работает....
можно вывод того как он не работает так как я выше показал - то есть пример того как ты запускаешь его, а потом cat того что ты запускаешь?
в общем ещё замечание.... в RESULT пусто... если убрать RESULT=`...` то ошибка....
и ещё что касается пробелов то они в переменных отсутствуют.... в DATABASES только db1....
ты убрал то что вызывает ошибку.... .... если убрать то и у меня никаких ошибок... если закоментированный код поместить не в цикле.... то все работает(вот только это будет только для одной БД)... когда сую в цикл или скажем в отдельную функцию получаю ошибку...
ты убрал то что вызывает ошибку.... .... если убрать то и у меня никаких ошибок... если закоментированный код поместить не в цикле.... то все работает(вот только это будет только для одной БД)... когда сую в цикл или скажем в отдельную функцию получаю ошибку...
ты убрал то что вызывает ошибку.... .... если убрать то и у меня никаких ошибок... если закоментированный код поместить не в цикле.... то все работает(вот только это будет только для одной БД)... когда сую в цикл или скажем в отдельную функцию получаю ошибку...
RESULT=` echo "dump ${TYPE} ${DATABASE} to '${DUMPPATH}/$DUMPNAME'
go" | isql -U$USERNAME -P$PASSWORD -S$SERVER | grep "DUMP is complete"`
(если go тут вообще надо)
я так понимаю isql с STDIN эти команды должна брать? а не находит оно конец файла тот который между :end у тебя?
go должно идти отдельной строкой.... иначе dump не отработает вообще...
я просто не могу понять ... почему если вынести это за цикл то все работает....
go должно идти отдельной строкой.... иначе dump не отработает вообще...
я просто не могу понять ... почему если вынести это за цикл то все работает....
попробуй так как я сказал, вообще не могу понять как оно у тебя работает, конструкция по идее должна делать примерно тоже что допустим:
RESULT=`cat |grep test <<:end
dump ${TYPE} ${DATABASE} to '${DUMPPATH}/$DUMPNAME'
go
:end`
так вот это и с циклом и без цикла не работае - потому что все фактически передается в grep, а не в cat .... а cat виснит и ждет ввода.
вот так работает
go должно идти отдельной строкой.... иначе dump не отработает вообще...
я просто не могу понять ... почему если вынести это за цикл то все работает....
попробуй так как я сказал, вообще не могу понять как оно у тебя работает, конструкция по идее должна делать примерно тоже что допустим:
RESULT=`cat |grep test <<:end
dump ${TYPE} ${DATABASE} to '${DUMPPATH}/$DUMPNAME'
go
:end`
так вот это и с циклом и без цикла не работае - потому что все фактически передается в grep, а не в cat .... а cat виснит и ждет ввода.
вот так работает
угу.... таким макаром не поёдет.... команда go должна идти с новой строки... иначе интерпретатор её не воспримет.... и естественно никакого дампирования не будет...
проще говоря ... если это выполнять в консоли, то должно выглядеть примерно так..
~/scripts> isql -Uuser -SServer
Password:
1> dump database DB to '/path/db.dmp'
2> go
Backup Server session id is: 106. Use this value when executing the
'sp_volchanged' system stored procedure after fulfilling any volume change
request from the Backup Server.
Backup Server: 4.41.1.1: Creating new disk file /path/db.dmp.
Backup Server: 6.28.1.1: Dumpfile name 'DB82900BFF0 ' section number 1
mounted on disk file '/path/db.dmp'
Backup Server: 4.58.1.1: Database DB: 25660 kilobytes DUMPed.
Backup Server: 4.58.1.1: Database DB: 44650 kilobytes DUMPed.
....
Backup Server: 3.43.1.1: Dump phase number 1 completed.
Backup Server: 3.43.1.1: Dump phase number 2 completed.
Backup Server: 3.43.1.1: Dump phase number 3 completed.
Backup Server: 4.58.1.1: Database DB: 2192284 kilobytes DUMPed.
Backup Server: 3.42.1.1: DUMP is complete (database DB).
1>
угу.... таким макаром не поёдет.... команда go должна идти с новой строки... иначе интерпретатор её не воспримет.... и естественно никакого дампирования не будет...
проще говоря ... если это выполнять в консоли, то должно выглядеть примерно так..
она пойдет ровно так же(там ведь не две строчки не зря):
diesel@indie:~$ echo "line 1
> line 2
> line 3" |cat
line 1
line 2
line 3
diesel@indie:~$
угу.... таким макаром не поёдет.... команда go должна идти с новой строки... иначе интерпретатор её не воспримет.... и естественно никакого дампирования не будет...
проще говоря ... если это выполнять в консоли, то должно выглядеть примерно так..
она пойдет ровно так же(там ведь не две строчки не зря):
diesel@indie:~$ echo "line 1
> line 2
> line 3" |cat
line 1
line 2
line 3
diesel@indie:~$
не хочет.... прикол в том что если запускать из консоли то проходит и твой вариант и мой... почему из скрипта не хочет...
угу.... таким макаром не поёдет.... команда go должна идти с новой строки... иначе интерпретатор её не воспримет.... и естественно никакого дампирования не будет...
проще говоря ... если это выполнять в консоли, то должно выглядеть примерно так..
она пойдет ровно так же(там ведь не две строчки не зря):
diesel@indie:~$ echo "line 1
> line 2
> line 3" |cat
line 1
line 2
line 3
diesel@indie:~$
не хочет.... прикол в том что если запускать из консоли то проходит и твой вариант и мой... почему из скрипта не хочет...
не хочет - сам сервер бэкапить, или ....?
может быть там еще ньюлайн нужен:
RESULT=` echo "dump ${TYPE} ${DATABASE} to '${DUMPPATH}/$DUMPNAME'
go
" | isql -U$USERNAME -P$PASSWORD -S$SERVER | grep "DUMP is complete"`
угу.... таким макаром не поёдет.... команда go должна идти с новой строки... иначе интерпретатор её не воспримет.... и естественно никакого дампирования не будет...
проще говоря ... если это выполнять в консоли, то должно выглядеть примерно так..
она пойдет ровно так же(там ведь не две строчки не зря):
diesel@indie:~$ echo "line 1
> line 2
> line 3" |cat
line 1
line 2
line 3
diesel@indie:~$
не хочет.... прикол в том что если запускать из консоли то проходит и твой вариант и мой... почему из скрипта не хочет...
не хочет - сам сервер бэкапить, или ....?
может быть там еще ньюлайн нужен:
RESULT=` echo "dump ${TYPE} ${DATABASE} to '${DUMPPATH}/$DUMPNAME'
go
" | isql -U$USERNAME -P$PASSWORD -S$SERVER | grep "DUMP is complete"`
в RESULT пусто ... причём с grep и без него... т.е. команда просто не выполняется...
RESULT=` echo "dump ${TYPE} ${DATABASE} to '${DUMPPATH}/$DUMPNAME'
go
" | isql -U$USERNAME -P$PASSWORD -S$SERVER | grep "DUMP is complete"`
в RESULT пусто ... причём с grep и без него... т.е. команда просто не выполняется...
На всякий случай избавьтесь от deprecated синтаксиса `...`, от этого тоже непредсказуемое поведение может быть. Вместо `...` рекомендуется использовать $(...).