使用Ruby和Variables编写bash脚本来运行FFMPEG命令

时间:2017-05-20 15:08:51

标签: ruby linux bash ffmpeg

我正在尝试创建一个简单的ruby脚本,通过bash运行ffmpeg命令将音频文件从一种格式转换为另一种格式。

命令为ffmpeg -i (in file) -acodec libmp3lame -ab 64k -ar 48000 -ac 1 AAA_S00E00_Podcast.mp3

我有一个具有正确权限的ruby脚本,我可以调用(在进行ffmpeg尝试之前使用system ls调用测试它)

#!/bin/ruby

def mkmp3( one = "", two = "" )
    system "ffmpeg -i #{one} -acodec libmp3lame -ab 64k -ar 48000 -ac 1 #{two}.mp3"
end

mkmp3

但是当我从bash中调用它来尝试将名为session.flac的文件转换为smoochie.mp3时,我会回来:

mkmp3.rb ('session.flac', 'smoochie')
bash: syntax error near unexpected token `'session.flac','

2 个答案:

答案 0 :(得分:1)

错误是因为您使用括号()向ruby脚本添加参数。删除它们,错误将消失;实际上,您只需要指定由空格分隔的字符串(否则您将以逗号,作为字符串):

$ mkmp3.rb session.flac smoochie

现在,要使用这些参数,您需要在脚本中添加ARGV,如下所示:

#!/bin/ruby

def mkmp3( one = ARGV[0], two = ARGV[1] )
    system "ffmpeg -i #{one} -acodec libmp3lame -ab 64k -ar 48000 -ac 1 #{two}.mp3"
end

mkmp3

ARGV将包含一个包含您添加的参数的字符串数组,请考虑此脚本(test.rb):

#!/bin/ruby

puts ARGV.inspect

执行脚本:

$ ruby so.rb one two

输出将是:

["one", "two"]

所以你使用数组索引访问每个值(即ARGV[0]ARGV[1])。

答案 1 :(得分:1)

通过使用带括号的值调用脚本,您无法将参数传递给脚本中的函数。您需要使用ARGV来处理脚本的参数。

我的系统上没有ffmpeg,因此我将说明如何使用命令行参数和一个报告其参数的简单函数:

def my_function(first = "default1", second = "default2")
  puts "Args were #{first} and #{second}"
end

if __FILE__ == $PROGRAM_NAME  # only invoke with ARGV if script is invoked directly
  my_function(*ARGV)  # flatten the ARGV array and pass all values
end

使用不同数量的参数调用时生成以下内容:

Desktop$ ruby argv_demo.rb 
Args were default1 and default2
Desktop$ ruby argv_demo.rb one
Args were one and default2
Desktop$ ruby argv_demo.rb one two
Args were one and two
Desktop$ ruby argv_demo.rb one two three
argv_demo.rb:1:in `my_function': wrong number of arguments (given 3, expected 0..2) (ArgumentError)
    from argv_demo.rb:6:in `<main>'