Howdie,

У меня есть скрипт bash, который устанавливает phppgadmin и заменяет псевдоним phppgadmin на!PhpPgAdmin.

Это мой сценарий:

#installing phppgadmin and tell my Apache conf file to include it
apt-get install --force-yes phppgadmin && echo 'Include /etc/phppgadmin/apache.conf' >> /my/conf/apache2/apache2.conf

# the string manipulation
phppgadmin=`cat /etc/phppgadmin/apache.conf`
phppgadmin=${phppgadmin/Alias \/phppgadmin/Alias \/!phppgadmin}

#saving result
echo -e $phppgadmin > /etc/phppgadmin/apache.conf

Это работает хорошо, за исключением случаев, когда разрывы строк теряются по пути, поэтому, конечно, Apache жалуется, что файл не читается. Я пытался с кошкой -E, безуспешно.

Любая идея?

РЕДАКТИРОВАТЬ: Хорошо, кажется, что я не понял, что делает cat -E . На самом деле он заменяет разрывы строк знаком доллара, так что теперь я начал работать:

phppgadmin=`cat -E /etc/phppgadmin/apache.conf`
phppgadmin=${phppgadmin/Alias \/phppgadmin/Alias \/!phppgadmin}
phppgadmin=${phppgadmin//$/'\n'}

echo -e $phppgadmin > /etc/phppgadmin/apache.conf

Итак, проблема решена!

1 ответ1

0

Для изменения файлов конфигурации sed более надежен, чем bash:

sed -i 's|^Alias /phppgadmin|Alias /!phppgadmin|' /etc/phppgadmin/apache.conf

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

Дополнительно:

  1. Не используйте `cat` , используйте` `<file` или $(<file) .

  2. ${phppgadmin//$/'\n'} уничтожит все реальные $ мог иметь исходный файл конфигурации.

Переписанный скрипт, все еще не такой надежный, как команда sed выше:

conf=$(< /etc/phppgadmin/apache.conf)
conf=${conf/Alias \/phppgadmin/Alias \/!phppgadmin}
echo "$conf" > /etc/phppgadmin/apache.conf

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .