Mám tento shell skript v súbore s názvom a.sh:
export A="a"
export B=b
export C=1
export D=$USER # say $USER is root
Existujú aj iné podobné súbory b.sh, c.sh, atď.
Potrebujem prečítať súbor shell, povedzme a.sh, z rubínového skriptu a premeniť ho na Ruby hash:
{ "A" => "a", "B" => "b", "C" => 1, "D" => "root" }
Ako to dosiahnuť?
odpovede:
3 pre odpoveď č. 1Ak máte spustený bash skript pred rubínovým, môžete urobiť niečo takéto:
Hash[([ "A", "B", "C", "D" ] & ENV.keys).map {|x| [x, ENV[x]] }]
kde pole [ "A", "B", "C", "D" ]
obsahuje platné názvy premenných na vytvorenie Hash
.
Ak potrebujete analyzovať skript bash v rubíne, postupujte takto:
vars = {}
IO.read("shell.sh").each do| line |
if line =~ /^exports([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"}