2014-04-08 85 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

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