首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Ruby编写shell脚本?

如何使用Ruby编写shell脚本?
EN

Stack Overflow用户
提问于 2008-10-03 11:03:07
回答 10查看 132.2K关注 0票数 168

我有一些简单的shell脚本任务需要完成

例如:从与某个正则表达式匹配的文件列表中选择工作目录中的一个文件。

我知道我可以使用标准的bash和grep来做这类事情,但是如果我能够快速编写在windows和linux中工作的脚本,而不需要记住一堆命令行程序和标志等等,那就太好了。

我试着这样做,但最终弄不清楚我应该从哪里获得信息,比如对当前目录的引用

所以问题是我需要知道Ruby库的哪些部分才能编写ruby shell脚本?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-10-03 13:30:59

默认情况下,您已经可以访问DirFile,它们本身就非常有用。

代码语言:javascript
复制
Dir['*.rb'] #basic globs
Dir['**/*.rb'] #** == any depth of directory, including current dir.
#=> array of relative names

File.expand_path('~/file.txt') #=> "/User/mat/file.txt"
File.dirname('dir/file.txt') #=> 'dir'
File.basename('dir/file.txt') #=> 'file.txt'
File.join('a', 'bunch', 'of', 'strings') #=> 'a/bunch/of/strings'

__FILE__ #=> the name of the current file

来自stdlib的FileUtils也很有用。

代码语言:javascript
复制
require 'fileutils' #I know, no underscore is not ruby-like
include FileUtils
# Gives you access (without prepending by 'FileUtils.') to
cd(dir, options)
cd(dir, options) {|dir| .... }
pwd()
mkdir(dir, options)
mkdir(list, options)
mkdir_p(dir, options)
mkdir_p(list, options)
rmdir(dir, options)
rmdir(list, options)
ln(old, new, options)
ln(list, destdir, options)
ln_s(old, new, options)
ln_s(list, destdir, options)
ln_sf(src, dest, options)
cp(src, dest, options)
cp(list, dir, options)
cp_r(src, dest, options)
cp_r(list, dir, options)
mv(src, dest, options)
mv(list, dir, options)
rm(list, options)
rm_r(list, options)
rm_rf(list, options)
install(src, dest, mode = <src's>, options)
chmod(mode, list, options)
chmod_R(mode, list, options)
chown(user, group, list, options)
chown_R(user, group, list, options)
touch(list, options)

这是非常好的

票数 150
EN

Stack Overflow用户

发布于 2008-10-03 11:41:04

正如其他人已经说过的,你的第一行应该是

代码语言:javascript
复制
#!/usr/bin/env ruby

您还必须使其可执行:(在shell中)

代码语言:javascript
复制
chmod +x test.rb

然后遵循拼音代码。如果您打开一个文件

代码语言:javascript
复制
File.open("file", "r") do |io|
    # do something with io
end

该文件将在您在shell中使用pwd获得的当前目录中打开。

脚本的路径也很容易获取。使用$0,您将获得shell的第一个参数,即脚本的相对路径。可以这样确定绝对路径:

代码语言:javascript
复制
#!/usr/bin/env ruby
require 'pathname'
p Pathname.new($0).realpath()

对于文件系统操作,我几乎总是使用Pathname。这是许多其他文件系统相关类的包装器。也很有用:目录,文件...

票数 111
EN

Stack Overflow用户

发布于 2009-11-27 13:52:03

下面是其他答案中遗漏的重要内容:命令行参数通过ARGV (global)数组向Ruby shell脚本公开。

因此,如果您有一个名为my_shell_script的脚本:

代码语言:javascript
复制
#!/usr/bin/env ruby
puts "I was passed: "
ARGV.each do |value|
  puts value
end

...make it可执行文件(正如其他人所提到的):

代码语言:javascript
复制
chmod u+x my_shell_script

并这样称呼它:

代码语言:javascript
复制
> ./my_shell_script one two three four five

你会得到这样的结果:

代码语言:javascript
复制
I was passed: 
one
two
three
four
five

这些参数可以很好地处理文件名扩展:

代码语言:javascript
复制
./my_shell_script *

I was passed: 
a_file_in_the_current_directory
another_file    
my_shell_script
the_last_file

其中大部分只适用于UNIX (Linux、Most ),但您可以在Windows中执行类似的操作(尽管不太方便)。

票数 67
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/166347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档