当通过Cygwin64运行shell脚本时,我会得到一个错误(输出如下)。脚本的相关部分如下。有趣的是,如果我复制并粘贴回显的命令,它就会毫无怨言地运行。那么,我到底做错了什么呢?
[worldwidewilly@SAL9000 resources]$ makebook MyBook
Generating dblatex PDF output via a2x
a2x -v -f pdf -L --asciidoc-opts='-a lang=en -v -b docbook -d book' --dblatex-opts='-V -T db2latex' MyBook.asciidoc
Usage: a2x [OPTIONS] SOURCE_FILE
a2x: error: option -d: invalid choice: "book'" (choose from 'article', 'manpage', 'book')
done.以下是脚本逻辑:
ASCIIDOC_OPTS="--asciidoc-opts='-a lang=en -v -b docbook -d book'"
DBLATEX_OPTS="--dblatex-opts='-V -T db2latex'"
echo "Generating dblatex PDF output via a2x"
cmd="a2x -v -f pdf -L ${ASCIIDOC_OPTS} ${DBLATEX_OPTS} $1.asciidoc"
echo $cmd
$cmd
echo "done."该脚本已保存为带有*nix文件结尾的UTF-8。这是在Windows7上运行的Cygwin64的新安装。
我有个解决办法。如果我在单词book之后和单个撇号之前添加一个空格,它就会从上面的错误中得到。但是,则将-T中的DBLATEX_OPTS标记为错误。
[worldwidewilly@SAL9000 resources]$ makebook MyBook
Generating dblatex PDF output via a2x
a2x -v -f pdf -L --asciidoc-opts='-a lang=en -v -b docbook -d book ' --dblatex-opts='-V -T db2latex' MyBook.asciidoc
Usage: a2x [OPTIONS] SOURCE_FILE
a2x: error: no such option: -T
done.而且,如果我复制回显的命令并从命令行运行它,它就能工作。这一切都很令人困惑。
发布于 2013-08-20 00:24:53
变量应该包含数据,bash将它们视为数据。这意味着shell元字符(如引号)也被视为数据。
有关该主题的完整讨论,请参见这篇文章。
简单的回答是使用数组代替:
ASCIIDOC_OPTS=( --asciidoc-opts='-a lang=en -v -b docbook -d book' )
DBLATEX_OPTS=( --dblatex-opts='-V -T db2latex' )
cmd=(a2x -v -f pdf -L "${ASCIIDOC_OPTS[@]}" "${DBLATEX_OPTS[@]}" "$1".asciidoc)
# Print command in pastable format:
printf '%q ' "${cmd[@]}"
printf '\n'
# Execute it
"${cmd[@]}"确保不使用eval
eval "$cmd" #noooo这似乎适用于您的代码,当您发布它,但有警告和安全问题。
https://stackoverflow.com/questions/18325007
复制相似问题