2014-09-04 84 views
1

我有兩個變量,我需要連接在一起形成一個服務器名稱與其fqdn。由於權限問題,我只能訪問某些文件來獲取信息。也許下面並不是獲得Ruby變量的最好方法,但它們工作。如果有一種更有效的方式,我是全部耳朵。無論如何,以下是變數。由於我無法從一個地方獲得服務器/ fqdn,我不得不從兩個不同的資源,一個文件和hostname命令中獲取。我需要讓他們成爲server.fqdn.com:連接Ruby變量

$server=`grep server /etc/config_file | awk '{print $2}'` 
$domain=`hostname -d` 

同樣,我試圖讓他們在一起,使server.fqdn.com

謝謝!

+0

使用'{}'按鈕正確格式化代碼片段。 – tadman 2014-09-04 17:15:44

回答

5

在Ruby中使用像這樣的全局變量不是一個好主意。 $表示全局的,而不僅僅是PHP或Perl中的任何普通變量。

連接兩個字符串:

fqdn = server + domain 

或者以點加盟:

fqdn = [ server, domain ].join('.') 

記住了grepawk操作可以內化到Ruby來避免的混亂掏出兩次。

+0

謝謝!我將這個腳本從bash移植過來,並且已經設置了這些變量,他們仍然以ruby的方式工作。我需要改變我如何在腳本中將我的變量稱爲更類似ruby的變量。這有助於此。 – 2014-09-05 12:40:48

+0

在ruby中使用grep/awk從文件中提取字符串以創建變量的最有效方法是什麼? – 2014-09-05 13:10:01

+0

Ruby有類似的功能,比如'File.readlines('/ etc/config_file')。grep(/ server /)。first.split(/ \ s + /)[1]'可能接近你想要的。 – tadman 2014-09-06 01:55:01

2

1)我知道shell腳本爲零,但爲什麼你不能只是寫:

awk '/server/ {print $2}' /etc/config_file 

?你爲什麼需要grep?

2)您的程序在Mac OSX上將不起作用,因爲它的hostname命令沒有-d標誌(至少在版本10.6.8中)。是否以下內容:

require 'socket' 
puts Socket.gethostname 

給你你需要的信息?

如果是這樣,你可以在ruby中做所有事情。這不就是你首先使用紅寶石的原因,也就是說,你不必在shell腳本雞身上搔癢嗎?

require 'socket' 

domain = Socket.gethostname 
server_name = nil 

IO.foreach('/etc/config_file') do |line| 
    if line.match /server/ 
    _, server_name = line.split(" ", 3) 
    break 
    end 
end 

something = "#{server_name}.#{domain}" 
puts something 
+0

+1「在污垢中刮傷......」。 (實際上,答案爲+1,但這個表達是無價的。) – 2014-09-04 19:34:02

+0

謝謝你的回答。是的,我可以用這種方式執行awk命令。我從bash來到ruby。這是一個我已經移植到ruby的bash腳本。我仍然在學習,並將我的想法從bash轉換爲ruby。非常感謝您的意見,這非常有用! – 2014-09-05 12:37:25

+0

@CarySwoveland,:) – 7stud 2014-09-05 19:04:54

0

也嘗試使用二進制左移運算符! (AKA小於號)

var = "Server" 
var2 = "Domain" 
var << var2 

它等於說:

var = "Server" 
var2 = "Domain" 
var3 = var.concat(var2) 

希望這給你更多的選擇!