【发布时间】:2011-06-12 07:40:59
【问题描述】:
假设我有一些实用程序可以接受多个选项,每个选项后跟一个文件名。例如,我可以将其称为myutil、myutil -o somefile、myutil -p anotherfile、myutil -o somefile -p anotherfile 等...... (取决于包装脚本内部的一些条件,这些条件与此问题无关)。
我想过做这样的事情:
#!/bin/sh
file1=somefile
file2=anotherfile
if [ somecriteria = true ]; then
OPT1="-o $file1"
fi
if [ othercriteria = true ]; then
OPT2="-p $file2"
fi
myutil $OPT1 $OPT2
这很好用——只要两个文件名都没有空格:假设ifs 都为真,myutil 得到 $1 = [-o]、$2 = [somefile]、$3 = [-p] 和 $4 = [另一个文件]。但是,如果有空格,例如file1="some file",$1 = [-o],$2 = [some],$3 = [file] 等。当然,我想要的是 $2 = [some file]。
在 OPT1 和 OPT2 中的文件名周围加上另一组引号并没有帮助;例如,如果我将其更改为 OPT1="-o \"$file1\"",那只会得到 $2 = ["some] 和 $3=[file"]。并且在对myutil 的调用中在 $OPT1 和 $OPT2 周围加上引号也不起作用:如果我这样做,$1 = [-o some file]。
那么,是否有一些技巧可以让这个工作,或者其他一些可以做我想要的方法?我希望它坚持标准的 shell 功能,所以请不要使用 bash-isms 或 ksh-isms :) 请参阅 this 了解标准中的内容。
【问题讨论】:
-
如果你这样设置你的变量:
var=true,那么你可以这样写你的条件:if $var; then do something; fi -
if语句只是为了更像伪代码 :)[ somecriteria = true ]比较文字字符串somecriteria和true,并且总是错误的——实际代码肯定不是不喜欢这样:)