有了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