如何将shell脚本求值为Ruby哈希?
我在一个名为a.sh的文件中有这个shell脚本:如何将shell脚本求值为Ruby哈希?,ruby,Ruby,我在一个名为a.sh的文件中有这个shell脚本: export A='a' export B=b export C=1 export D=$USER # say $USER is root 还有其他一些类似的文件b.sh、c.sh等 我需要从ruby脚本中读取shell文件,比如a.sh,并将其转换为ruby哈希: { 'A' => 'a', 'B' => 'b', 'C' => 1, 'D' => 'root' } 如何实现这一点?如果在ruby脚本之前运行ba
export A='a'
export B=b
export C=1
export D=$USER # say $USER is root
还有其他一些类似的文件b.sh、c.sh等
我需要从ruby脚本中读取shell文件,比如a.sh,并将其转换为ruby哈希:
{ 'A' => 'a', 'B' => 'b', 'C' => 1, 'D' => 'root' }
如何实现这一点?如果在ruby脚本之前运行bash脚本,则可以执行以下操作:
Hash[([ 'A', 'B', 'C', 'D' ] & ENV.keys).map {|x| [x, ENV[x]] }]
其中数组['A','B','C','D']
包含用于创建散列的有效变量名
如果需要在ruby中解析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"}
您的环境变量位于ENV
常量中。很抱歉,我可能没有明确说明。在ruby脚本之前没有执行shell脚本,我需要阅读ruby脚本中的shell脚本。所以ENV还没有包含这些变量。@МаъСаъСъъ:我知道,标记标记很有趣,但请不要:)@МаъСъъъ谢谢你的回答。但那仍然不是我想要的。因为shell.sh可能是一个真正的shell脚本,所以我必须使用shell来解释它,然后从环境中获得结果。@Evani请决定否。您之前是否运行该脚本。