bashshell脚本错误在命令行中工作,而不是在脚本中

bashshell脚本错误在命令行中工作,而不是在脚本中,bash,cygwin,Bash,Cygwin,当通过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' --d

当通过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."
脚本已保存为UTF-8,文件结尾为*nix。这是在Windows 7上运行的Cygwin64的新安装

FWIW-我有一些解决办法。如果我在单词book之后,在单撇号之前加一个空格,它就会出现上面的错误。但是,dbu选项中的-T被标记为错误

[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.

同样,如果我复制回显命令并从命令行运行它,它就会工作。这一切都非常混乱。

变量应该包含数据,而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

这似乎与您发布的代码一起工作,但存在警告和安全问题

变量应该包含数据,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
这似乎与您发布的代码一起工作,但存在警告和安全问题