在bash脚本中处理双引号

时间:2013-04-19 13:14:03

标签: bash shell lcov

我正在尝试创建一个动态构造我需要执行的命令的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伟大的调试它。

以下是我从echo获得的输出类型:

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

你知道这里有什么不对吗?

此致

1 个答案:

答案 0 :(得分:3)

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

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

eval lcov "$LCOV_INPUT_FILES" -o ...

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

LCOV_INPUT_FILES+=(-a "$FILENAME")

然后只需用双引号扩展数组:

lcov "${LCOV_INPUT_FILES[@]}" -o ...