0

我正在尝试编写一个 bash 脚本,该脚本将动态构建我需要执行的命令。(合并 lcov 文件)

到目前为止,我能够构建命令行,结果如下:

#!/bin/bash
LCOV_INPUT_FILES=""
while read FILENAME; do
    LCOV_INPUT_FILES="$LCOV_INPUT_FILES -a \"$FILENAME\""
done < <( find ../reports/coverage -name lcov.info )

echo lcov "${LCOV_INPUT_FILES}" -o ../reports/coverage.lcov
lcov "${LCOV_INPUT_FILES}" -o ../reports/coverage.lcov

如果我在我的 shell 中运行该行echo输出,它可以工作,但我无法从我的脚本运行这个命令,而且我缺乏 bash 的伟大之处来调试它。

这是我从回声中得到的那种输出:

lcov  -a "../reports/coverage/Chrome 26.0 (Linux)/lcov.info" -a "../reports/coverage/Firefox 20.0 (Linux)/lcov.info" -a "../reports/coverage/PhantomJS 1.8 (Linux)/lcov.info" -o ../reports/coverage.lcov

你知道这里有什么问题吗?

问候,

泽维尔

4

1 回答 1

3

如果使用双引号"${LCOV_INPUT_FILES}",bash 会将整个字符串视为一个单词。如果没有双引号,bash 会将变量的值拆分为空格。

对于您构造字符串的方式,唯一的选择是使用eval

eval lcov "$LCOV_INPUT_FILES" -o ...

还有其他选择。您可以使用数组来存储参数

LCOV_INPUT_FILES+=(-a "$FILENAME")

然后用双引号扩展数组:

lcov "${LCOV_INPUT_FILES[@]}" -o ...
于 2013-04-19T13:22:56.437 回答