设为首页 加入收藏

TOP

Ruby和Linux Shell共同编程的示例
2015-02-02 14:36:44 来源: 作者: 【 】 浏览:8
Tags:Ruby Linux 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 <?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 <


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 <>>>" $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 <?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的例子吗!?


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python中的True, False条件判断 下一篇【图像处理】透视变换 Perspectiv..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: