Какова функция этого сценария оболочки sed? - PullRequest
0 голосов
/ 10 июля 2020

Я читал этот пример о настройке кластера с помощью pgpool и Watchdog и решил попробовать его в качестве упражнения.

Я далек от того, чтобы быть мастером оболочки сценариев, но я мог следовать документации и изменять ее в соответствии с настройками моих виртуальных машин. Но я не понимаю, какова цель следующего фрагмента:

if [ ${PGVERSION} -ge 12 ]; then
    sed -i -e \"\\\$ainclude_if_exists = '$(echo ${RECOVERYCONF} | sed -e 's/\//\\\//g')'\" \
           -e \"/^include_if_exists = '$(echo ${RECOVERYCONF} | sed -e 's/\//\\\//g')'/d\" ${DEST_NODE_PGDATA}/postgresql.conf
fi

В моем случае PGVERSION будет 12 (поэтому скрипт выполнит код после условия), RECOVERYCONF - /usr/local/pgsql/data/myrecovery.conf и DEST_NODE_PGDATA равно /usr/local/pgsql/data.

Я получаю (пожалуйста, извините и поправьте меня, если я ошибаюсь), что -e указывает, что следующий сценарий идет, часть $ (некоторые команды) оценивает выражение и возвращает результат и что регулярное выражение sed указывает, что символы '/' будут заменены на \ / (forward sla sh и sla sh). Что меня озадачивает, так это части "\\\$ainclude_if_exists =" и "/^include_if_exists", я не знаю, что они означают и для чего предназначены, ни как они взаимодействуют. Кроме того, меня смущает -e после первого регулярного выражения sed.

Если вас интересует контекст, эти команды находятся в конце примера сценария /var/lib/pgsql/11/data/recovery_1st_stage.

Спасибо заранее на ваше время.

1 Ответ

1 голос
/ 10 июля 2020

Вот крошечное представление того же кода:

sed -i -e '$amyvalue = foo' -e '/^myvalue = foo/d' myfile.txt

Первое выражение sed:

$                  # On the last line        
 a                 # Append the following text
  myvalue = foo    # (text to be appended)

Второе:

/                  # On lines matching regex..
 ^myvalue = foo    # (regex to match)
               /   # (end of regex)
                d  # ..delete the line

Итак он удаляет любые myvalue = foo, которые могут уже существовать, а затем добавляет одну такую ​​строку в конце. Дело в том, чтобы убедиться, что у вас есть ровно одна строка: A. добавляя строку, если она отсутствует, B. не дублируйте строку, если она уже существует.

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

...