Bash script - взять системный вывод и использовать его как переменную - PullRequest
0 голосов
/ 06 сентября 2010

Довольно простой вопрос, я пытаюсь получить какой-то вывод после выполнения команды и использовать его снова.

#!/bin/bash
echo what's the source db name?
read SOURCE
echo what's the target db name?
read TARGET
db2 backup db $SOURCE online compress include logs
READ SOME OF THIS LINE = SOURCE
db2 restore database $SOURCE taken at $DB2TIME into $TARGET

строка "ЧИТАТЬ НЕКОТОРЫЕ ЭТОЙ ЛИНИИ" выводит примерно так: Резервное копирование успешно.Отметка времени для этого образа резервной копии: 20100906142221 Я думаю, что команда grep сделает это, но я не уверен на 100%

Ответы [ 3 ]

0 голосов
/ 06 сентября 2010

Продолжая ответ @ pax, ваш код теперь становится:

#!/bin/bash
echo what's the source db name?
read SOURCE
echo what's the target db name?
read TARGET
DB2TIME=$(db2 backup db $SOURCE online compress include logs)
# you have read it above <--- READ SOME OF THIS LINE = SOURCE
db2 restore database $SOURCE taken at $DB2TIME into $TARGET
0 голосов
/ 06 сентября 2010

@ pax @dennis @pavanlimo Извините, я сделал опечатку, когда писал это,

Мне нужно прочитать $ DB2TIME после выполнения:

db2 backup db $SOURCE online compress include logs

Я получаю вывод:

The timestamp for this backup image is : 20100906142221

Мне нужно превратить 20100906142221 в $ DB2TIME, чтобы я мог выполнить следующую команду

db2 restore database $SOURCE taken at $DB2TIME into $TARGET
0 голосов
/ 06 сентября 2010

В bash вы фиксируете вывод команды с помощью $() (или обратных кавычек, но я предпочитаю первые, поскольку вы можете их вкладывать):

pax> xx=$(ls -1 | grep bac)

pax> echo "..${xx}.."
..backup0.sh
backup1.sh..

Итак, в вашем конкретном случаевы бы смотрели на что-то вроде:

timestamp=$(db2 backup db $SOURCE online compress include logs 2>&1
    | tee /tmp/output
    | grep 'image is'
    | awk '{print $11}')

Имейте в виду, я разбил это на несколько строк для удобства чтения, но оно должно идти на одной строке.Что касается того, как это работает:

  • 2>&1 сочетает в себе стандартный вывод и ошибку.
  • tee гарантирует, что весь вывод хранится где-то.
  • grep даст вам соответствующую строку.
  • awk напечатает только 20100906142221.
  • xx=$(...) возьмет это и присвоит xx.

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


Исходя из комментариев, вот что вам нужно начать:

#!/bin/bash
echo what's the source db name?
read SOURCE
echo what's the target db name?
read TARGET
db2 backup db $SOURCE online compress include logs 2>&1 | tee /tmp/db_bkp_$$
DB2TIME=$(cat /tmp/db_bkp_$$ | grep 'image is' | awk '{print $11}')
rm -rf /tmp/db_bkp_$$
db2 restore database $SOURCE taken at $DB2TIME into $TARGET

Это выполнит команду DB2, отправив вывод и ошибку на терминал и во временный файл ($$ даетВы текущий идентификатор процесса, чтобы избежать конфликтов имен файлов).Затем вы извлекаете дату / время из временного файла, затем удаляете этот файл.

Затем вы используете дату / время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...