Bash脚本:将“带空格的字符串”传递给命令

时间:2016-01-23 06:12:23

标签: bash maven

我有以下bash脚本:

substring($x, Infinity)

当我运行脚本时,mvn命令变为:

set -o xtrace
TEST_CASE=@Login
mvn clean install --Dcucumber.options="--tags ${TEST_CASE}"

请注意,单引号包装整个-D参数,原始双引号已消失。但我想看到的是:

mvn clean install '-Dcucumber.options=--tags @Login'

我的原始脚本有什么问题?我应该如何更新以使其正确?

2 个答案:

答案 0 :(得分:2)

引号不是参数的一部分;它们只是为了防止shell将以--D开头的字符串分成两个要传递给mvn的参数。以下都是等效的,创建三个参数:

mvn clean install --Dcucumber.options="--tags ${TEST_CASE}"
mvn clean install "--Dcucumber.options=--tags ${TEST_CASE}"
mvn clean install --Dcucumber.options=--tags" ${TEST_CASE}"

以下创建 4 参数,因为tags与参数之间的空格未引用:

mvn clean install --Dcucumber.options=--tags "${TEST_CASE}"

您可以通过各种方式单独引用空格以保留3参数命令。 (请记住,相邻的字符串会自动连接):

mvn clean install --Dcucumber.options=--tags" ""${TEST_CASE}"
mvn clean install --Dcucumber.options=--tags' '"${TEST_CASE}"
mvn clean install --Dcucumber.options=--tags\ "${TEST_CASE}"

为了保持一致性,set -x始终会显示一个字符串,需要使用'...'引用并引用整个字符串,而不只是引用它的一部分。

答案 1 :(得分:1)

bash脚本无效吗?我说对文字字符串使用单引号,对要扩展的字符串使用双引号。

TEST_CASE='@Login'
mvn clean install --Dcucumber.options="--tags ${TEST_CASE}"

有什么错误消息? 我认为问题在于引用实际上并未包含在黄瓜选项中。所以试试这个:

TEST_CASE='@Login'
CUCE_OPTS='"--tags '${TEST_CASE}'"'
mvn clean install --Dcucumber.options=${CUCE_OPTS}