Лучший / самый простой способ разобрать параметры конфигурации в Sh / Bash и php - PullRequest
8 голосов
/ 13 августа 2010

Я получил в каждом php-проекте (около 25!) Несколько сценариев sh, которые помогают мне в рутинных задачах, таких как развертывание, синхронизация репозиториев, экспорт / экспорт баз данных и т. Д.для всех проектов, которыми я управляю, поэтому должен быть файл конфигурации для хранения различных параметров, которые зависят от проекта:

# example conf, the sintaxys only needs to be able to have comments and be easy to edit.
host=www.host.com
administrator_email=guill@company.com
password=xxx

Мне просто нужно найти чистый способ чтения этого файла конфигурации (разбор) из скрипта sh, и в то же время иметь возможность читать те же параметры из моих скриптов PHP.Без использования XML.

Знаете ли вы хорошее решение для этого?

Guillermo

Ответы [ 5 ]

17 голосов
/ 13 августа 2010

Просто поставьте файл сценария conf как другой файл sh!

Пример:

conf-file.sh:

# A comment
host=www.host.com
administrator_email=guill@company.com
password=xxx

Фактический сценарий:

#!/bin/sh

. ./conf-file.sh

echo $host $administrator_email $passwword

И тот же conf-файл может быть проанализирован в PHP: http://php.net/manual/en/function.parse-ini-file.php

6 голосов
/ 13 августа 2010

Если вы не хотите получать файл, как показано в pavanlimo, другой вариант - извлечь переменные с помощью цикла:

while read propline ; do 
   # ignore comment lines
   echo "$propline" | grep "^#" >/dev/null 2>&1 && continue
   # if not empty, set the property using declare
   [ ! -z "$propline" ] && declare $propline
done < /path/to/config/file

В PHP применяются те же основные понятия:

// it's been a long time, but this is probably close to what you need
function isDeclaration($line) {
    return $line[0] != '#' && strpos($line, "=");
}

$filename = "/path/to/config/file";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
$lines = explode("\n", $contents); // assuming unix style
// since we're only interested in declarations, filter accordingly.
$decls = array_filter($lines, "isDeclaration");
// Now you can iterator over $decls exploding on "=" to see param/value
fclose($handle);
3 голосов
/ 14 августа 2010

Для синтаксического анализатора файлов Bash INI также см .:

http://ajdiaz.wordpress.com/2008/02/09/bash-ini-parser/

1 голос
/ 14 августа 2010

для анализа INI-файла из sh / bash

#!/bin/bash
#bash 4
shopt -s extglob
while IFS="=" read -r key value
do
  case "$key" in
   !(#*) )
     echo "key: $key, value: $value"
     array["$key"]="$value"
     ;;
  esac
done <"file"
echo php -r myscript.php ${array["host"]}

затем из PHP, используйте argv

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