2016-01-22 75 views
0

我正试图解析发送给shell脚本的参数。例如发送到脚本值如下:在shell脚本中用引号解析参数

-to [email protected] -a file1.txt file2.txt "new file.txt" 

我可以解析字符串,使我得到-a我的运营商,但我想重新格式化参数部分file1.txt file2.txt "new file.txt",使它看起来像'file1.txt' 'file2.txt' 'new file.txt'使我可以将它传递给zip实用程序。

现在我用下面的分析参数,但它没有让我我想要的结果。它接近但不完全正确。

for file in `echo $PARM` 
do 
    FILE_LIST="$FILE_LIST '"$file"'" 
done 

这给了我'file1.txt' file2.txt' 'new' 'file.txt'我怎么能返工上面的代码给我我想要的东西。 谢谢

+1

zip?显示完整的示例。 http://xyproblem.info/ –

+2

请说明你如何赋值给PARM。 –

+2

这不是传递文件名到'zip'的好起点。单引号是shell语法,不能将字符串中的字面值传递给zip。改用数组。 –

回答

1

首先,你需要了解操作的顺序时,壳解析命令行。下面是一个部分列表:首先,它解释引号和转义,然后删除它们(在它们产生效果之后),然后展开任何变量引用(以及类似的东西,如反引号表达式),单词拆分和通配符 - 展开展开的变量值,然后最终将所有这些结果视为命令及其参数。

这对你想做什么两个重要的意义:通过你的脚本接收其论点的时候,就不再有报价;引号有其效果(new file.txt是一个单一的参数而不是两个),但引号本身已经消失。另外,当把变量放在变量中是无用的,因为当变量被扩展并且引号是命令行的一部分时,他们做任何有用的事情为时已晚 - 它们不被解析为引号,它们是只是作为参数的一部分传递给命令(其中不需要)。

幸运的是,答案很简单(和斯蒂芬·P总结在他的评论):把周围的所有变量引用双引号。这可以防止分词和通配符扩展阶段与其值相混淆,这意味着无论作为单个参数传递给您的脚本(例如new file.txt)都会作为单个参数传递。如果您需要传递所有参数,请使用"[email protected]"。如果您只需要传递一些信息,则可以使用shift来清除选项,然后"[email protected]"将传递其余的信息,或者使用例如"[email protected]""${@:4}"传递从#4开始的所有参数或"${@:4:3}"传递从#4开始的三个参数。