2011-05-30 64 views
1

说我有一个文件(因为它发生的PHP),与一些变量声明:解析文件和模式匹配复制到一个变量

$dbuser = 'fred'; 
$dppass = 'abc123'; 
$dhhost = '127.0.0.1'; 

我想从一个bash脚本做什么,解析这个文件,确定我需要的变量,并将它们的值读入我可以从BASH脚本访问的变量中。

显然,上述文件是PHP,还有其他的线,我不是有意

我可以使用下面的命令解压我从bash shell中所需的信息:

​​

整齐地返回

fred 

但是当我试图把它添加到一个bash脚本输出放到使用反引号的变量,如下所示:

dbuser=`grep \$dbuser config.php.inc | grep -Po "\'.*\'" | cut -d \' -f 2` 

我的BASH脚本在此处挂起。

为什么这样挂着,或者,有没有更好的方法来实现我想要实现的目标?

回答

1

这将返回文本就像var='value';

awk ' 
    match($1, /^\$([[:alnum:]_]+)=?/, m){ 
     gsub(/^[^=]+=[[:space:]]*/, "") 
     print m[1] "=" $0 
    } 
' < file.php 

可以eval输出。

更新

这比上面的简单得多。我意识到所有你需要做的就是删除第一$和删除空格周围的=

sed -e 's/\$//' -e 's/ *= */=/' file.php 
+1

哇!这是一个干净的做法。它会在一个调用mysql_connect函数'$ db = mysql_connect(...',但我可以轻松地将其转换为不同的包含以获得它的线路上失败。 – Bryan 2011-05-30 16:32:19

+0

...而失败,我的意思是''eval'部分将失败 – Bryan 2011-05-30 16:33:23

+0

'sed'版本不能很好地工作,因为它不能处理文件中的其他行,包括''和注释行,'ini_set', require_once'和一些其他的PHP特定行 – Bryan 2011-05-30 18:39:06

1

它听起来就像是有缺失的\

检查,如果这不是\\ $ DBUSER

如果你有机会到perl 尝试:

dbuser=$(perl -ne "print \$1 if /\$dbuser.*'(.*)'/" config.php.inc) 

注: - e使用下一个参数作为单线程脚本
-n使用所有参数作为文件参数
print $ 1当垫子打印匹配的图案ched
正则表达式中的parathesis定义$ 1捕获组。

+0

添加第二个转义字符可解决问题。目前我没有perl可用,但可以尝试一下。括号中是否定义了匹配输出的部分? – Bryan 2011-05-30 15:44:15

3

试试这样说:

dbuser=$(grep \$dbuser config.php.inc | grep -Po "\'.*\'" | cut -d \' -f 2) 

之所以这样工作和反引号的方式$没有为(命令)处理引用与旧式的反引号程序如何处理引用。

换句话说,下面的反引号命令会工作一样好:

dbuser=`grep '$dbuser' config.php.inc | grep -Po "'.*'" | cut -d"'" -f 2` 
  1. 用单引号括住$ DBUSER因为单引号意味着使用的文字文本,而不是插值它作为一个壳变量。
  2. 删除了*由于不需要转义。
  3. 由于不需要从已删除的命令中移除。

BTW,这会工作,以及:

dbuser=`grep '$dbuser' config.php.inc | grep -Po "\'.*\'" | cut -d \' -f 2` 

此外,$(命令)语法是一般的最佳方法只要有可能。如果你必须支持一个绝对知道不支持$(command)的平台,那么仅仅为了便携的原因使用````。这是恕我直言,非常罕见,所以经验法则是从一开始就倾向于$(命令)。

+1

你能解释为什么这个工程?我认为它确实有用 - 但它非常微妙。 – 2011-05-30 15:29:10

+0

这是一个比使用反引号更好的方法吗? – Bryan 2011-05-30 15:44:44

+1

基本上,是的,$(命令)是更好,更现代的方法。只有当你需要支持一个已知不支持$(command)的平台时,才会使用反引号。当你需要支持多层次的嵌套命令时,反引用的问题不是简单的引用,而是真的下降。 $(command)处理这个问题。 – 2011-05-30 18:32:06

1

一些基本的检查和安全

eval $(sed -n "s/^\$\([a-zA-Z][a-zA-Z0-9_]*\) *= *'\(.*\)' *;/\1='\2';/p") 
echo User:$dbuser Pass:$dppass Host:$dhhost 

将打印您的例子

User:fred Pass:abc123 Host:127.0.0.1