2014-04-08 53 views
1

我有一个文件,这个shell脚本命名为a.sh:如何评估一个Ruby脚本的shell脚本?

export A='a' 
export B=b 
export C=1 
export D=$USER # say $USER is root 

还有一些其他类似的文件b.sh,c.sh等

我需要阅读的shell文件,说a.sh,从Ruby脚本并将其转换为Ruby的哈希值:

{ 'A' => 'a', 'B' => 'b', 'C' => 1, 'D' => 'root' } 

如何实现这一目标?

+0

你有'ENV'恒定的环境变量。 –

回答

3

如果您对Ruby的一个之前运行bash脚本,你可以得到做这样的事情:

Hash[([ 'A', 'B', 'C', 'D' ] & ENV.keys).map {|x| [x, ENV[x]] }] 

其中阵列[ 'A', 'B', 'C', 'D' ]包含有效的变量名创建Hash

如果您需要解析红宝石bash脚本,请执行以下操作:

vars = {} 
IO.read('shell.sh').each do| line | 
    if line =~ /^export\s([A-Za-z_][A-Za-z_0-9]*)=\s*(?:['"]([^'"]*)['"]|(.*))\s*$/ 
     (name, value) = [ $1, $2 || $3 ] 
     value.gsub!(/\$(?:([A-Za-z_][A-Za-z_0-9]*)|{([^{}]+)})/) do| match | 
     ENV[ match[1..-1] ] 
     end 
     vars[ name ] = value.gsub(/#.*/, '').strip 
    end 
end 
vars 
# => {"A"=>"a", "B"=>"b", "C"=>"1", "D"=>"malo"} 
+0

对不起,我可能没有说清楚。 shell脚本不会在ruby脚本之前执行,我需要在ruby脚本中读取shell脚本。所以ENV还没有包含这些变量。 – TieDad

+0

@EvanLi更新 –

+1

@МалъСкрылевъ:我知道,标记标记很有趣,但请不要:) –