将命令行参数作为字符串传递给Lua

时间:2017-04-26 19:40:01

标签: lua

我正在尝试从Lua脚本执行Sox

当我将文字作为参数传递时,它工作正常。

os.execute('"C:\\Sox\\sox.exe" -S C:\\SoX\\test.wav -r 22050 C:\\Sox\\SoX_out.wav')

os.execute [["C:\\Sox\\sox.exe" -S C:\\SoX\\test.wav -r 22050 C:\\Sox\\SoX_out.wav]]
然而,当我尝试这个时,我想做什么(例如):

filename = "C:\\SoX\\test.wav"
os.execute('"C:\\Sox\\sox.exe" -S filename -r 22050 C:\\Sox\\SoX_out.wav')

我明白了:

  

C:\ Sox \ sox.exe失败格式:无法打开输入文件`filename':没有这样的文件或目录

所以我的问题是如何正确传递字符串作为命令参数?

1 个答案:

答案 0 :(得分:4)

在Lua中,字符串文字正是该字符串。字符串对变量,全局环境,局部变量等一无所知。它们只是字符串。 Lua中的字符串"filename"将始终是一个包含8个字符的字符串。它不会出去并试图找到一个名为filename的变量并从中提取一些东西。

你想要的是从多个字符串中构建一个字符串。字符串的一部分来自文字,部分来自变量。 Lua有几个工具。最简单的是..连接运算符:

[["C:\Sox\sox.exe" -S ]] .. filename .. [[ -r 22050 C:\Sox\SoX_out.wav]]

这将从字符串文字构建一个新字符串,filename变量的内容和另一个字符串文字。你在第一个文字的末尾和第二个文字的开头看到的空格是必要的,因为Lua不会在两个连接的部分之间插入空格。

对于更复杂的情况,仅构建参数表并使用table.concat从中构建字符串非常有用:

local params =
{
  [[C:\Sox\sox.exe]],
  "-S",
  filename,
  "-r 22050",
  [[C:\Sox\SoX_out.wav]]
}

os.execute(table.concat(params, " "))

请注意字符串文字中缺少空格。这是因为table.concat的第二个参数是要在数组中的条目之间插入的字符串。所以每个数组元素之间将是一个空格;我们不需要手动添加它们。