歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Ruby和Linux Shell共同編程的示例

Ruby和Linux Shell共同編程的示例

日期:2017/3/1 9:36:28   编辑:SHELL編程

有了shell為毛還要ruby呢?話不能這麼說,有些小功能用ruby還是很方便的,比如說字符串的反轉再加1功能用shell來寫就比較麻煩.str="123456",我們定義一個反轉後再+1的小方法:

2.1.5 :020 > class String
2.1.5 :021?> def r_add_1
2.1.5 :022?> replace reverse.each_byte.map {|byte|byte+1}.pack("c*")
2.1.5 :023?> end
2.1.5 :024?> end

執行後str變為:

2.1.5 :026 > "123456".r_add_1

=> "765432"

下面我們寫一個腳本把shell中的變量r_add_1一下:

#!/opt/local/bin/bash

export id="abc123456789" #just

cat <<EOF | ruby |read ret
class String
def r_add_1
replace reverse.each_byte.map {|b|b+1}.pack("c*")
end
end

puts ENV["id"].dup.r_add_1
EOF

執行一下看看:


linux@linuxidc: ruby_src$./read.sh

linux@linuxidc: ruby_src$echo $ret

linux@linuxidc: ruby_src$

咦,為毛ret變量為空值啊?道理很簡單:管道2側是2個不同進程,加上主bash的進程,一共是3個進程。你不用指望read ret進程建立的變量會在主bash進程中生效啊!一種解決辦法是用小括號強制read ret和echo在一個進程中執行以獲取返回值:cat <<EOF|ruby|(read ret;echo $ret):


linux@linuxidc: ruby_src$./read.sh

:98765432dcb

必須要加小括號哦,否則read ret和echo還是在2個進程,等於做無用功啊!你可以這樣做:


linux@linuxidc: ruby_src$my_val=$(./read.sh)

linux@linuxidc: ruby_src$echo $my_val

:98765432dcb

這樣就將返回結果保存在主bash進程中的my_val變量中了哦。或者你在while循環中自己處理吧,因為while循環和read也在一個進程裡哦,改寫後的shell代碼如下:

#!/opt/local/bin/bash

export id="abc123456789" #只是示例,實際可以動態獲取id的值

cat <<EOF | ruby | while read ret;do echo ">>>>" $ret;done
class String
def r_add_1
replace reverse.each_byte.map {|b|b+1}.pack("c*")
end
end

puts ENV["id"].dup.r_add_1
EOF

你要是覺得看的cat那一行太長,可以把do...done放到EOF結尾的後面,效果是一樣的:

#!/opt/local/bin/bash

export id="abc123456789" #只是示例,實際可以動態獲取id的值

cat <<EOF | ruby | while read ret
class String
def r_add_1
replace reverse.each_byte.map {|b|b+1}.pack("c*")
end
end

puts ENV["id"].dup.r_add_1
EOF
do
echo ">>>>" $ret
done

最後執行read.sh都會顯示:


linux@linuxidc: ruby_src$./read.sh

>>>> :98765432dcb

一切皆有可能!你最後肯定還會問:為毛我不用$my_val=$(ruby -e"xxx")這種純ruby的更簡單方法,而要用shell+ruby混合的復雜方法呢??答案是:我不是在舉ruby+shell的例子嗎!?

Shell編程淺析 http://www.linuxidc.com/Linux/2014-08/105379.htm

Linux Shell參數替換 http://www.linuxidc.com/Linux/2013-06/85356.htm

Shell for參數 http://www.linuxidc.com/Linux/2013-07/87335.htm

Linux/Unix Shell 參數傳遞到SQL腳本 http://www.linuxidc.com/Linux/2013-03/80568.htm

Shell腳本中參數傳遞方法介紹 http://www.linuxidc.com/Linux/2012-08/69155.htm

Shell腳本傳遞命令行參數 http://www.linuxidc.com/Linux/2012-01/52192.htm

Linux Shell 通配符、轉義字符、元字符、特殊字符 http://www.linuxidc.com/Linux/2014-10/108111.htm

Copyright © Linux教程網 All Rights Reserved