我正在尝试创建一个简单的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','
答案 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>'