传递bash变量,无需额外的单引号

时间:2015-02-25 20:01:56

标签: bash

如果软件版本包含特定的版本字符串,我试图传递额外的标志来使用bash变量。但是,bash扩展似乎会添加额外的单引号,导致make抛出错误。

if  [[ $SW_VER == *"v2.0.1"* ]] ;
then
  ADDITIONAL_FLAGS="CFLAGS=\"-DFLAG1 -DFLAG2\""
else
  ADDITIONAL_FLAGS=""
fi
make "$ADDITIONAL_FLAGS"

在脚本中使用-x选项我看到它扩展如下。

+ ADD_FLAGS='CFLAGS="-DFLAG1 -DFLAG2"'

如何避免上面的单引号?以下是实际意图。

make CFLAGS="-DFLAG1 -DFLAG2"

2 个答案:

答案 0 :(得分:2)

-x添加单引号以识别"字"在它的输出中,它们并不存在。

据说内部双引号实际存在并且这是一个问题(shell不会删除它们,因此它们最终会以CFLAGS的值结束。)

你想完全放弃它们。

ADDITIONAL_FLAGS="CFLAGS=-DFLAG1 -DFLAG2"

举例说明set -x的单引号和内部双引号的问题:

$ c ()
{
    printf 'argc: %s\n' "$#";
    printf 'argv: %s\n' "$@"
}
$ c arg1 'arg2 arg3' arg4 # Example of c function usage and behavior.
argc: 3
argv: arg1
argv: arg2 arg3
argv: arg4
$ set -x
$ ADDITIONAL_FLAGS="CFLAGS=\"-DFLAG1 -DFLAG2\""
+ ADDITIONAL_FLAGS='CFLAGS="-DFLAG1 -DFLAG2"'
$ echo "$ADDITIONAL_FLAGS"
+ echo 'CFLAGS="-DFLAG1 -DFLAG2"'
CFLAGS="-DFLAG1 -DFLAG2"
# See how the single quotes are only in the set -x output there?
$ c "$ADDITIONAL_FLAGS"
+ c 'CFLAGS="-DFLAG1 -DFLAG2"'
+ printf 'argc: %s\n' 1
argc: 1
+ printf 'argv: %s\n' 'CFLAGS="-DFLAG1 -DFLAG2"'
argv: CFLAGS="-DFLAG1 -DFLAG2"
# See how the internal double quotes are in the actual argument value?
$ ADDITIONAL_FLAGS="CFLAGS=-DFLAG1 -DFLAG2"
+ ADDITIONAL_FLAGS='CFLAGS=-DFLAG1 -DFLAG2'
$ echo "$ADDITIONAL_FLAGS"
+ echo 'CFLAGS=-DFLAG1 -DFLAG2'
CFLAGS=-DFLAG1 -DFLAG2
$ c "$ADDITIONAL_FLAGS"
+ c 'CFLAGS=-DFLAG1 -DFLAG2'
+ printf 'argc: %s\n' 1
argc: 1
+ printf 'argv: %s\n' 'CFLAGS=-DFLAG1 -DFLAG2'
argv: CFLAGS=-DFLAG1 -DFLAG2

答案 1 :(得分:0)

尝试

if  [[ $SW_VER == *"v2.0.1"* ]] ;
then
  ADDITIONAL_FLAGS='CFLAGS="-DFLAG1 -DFLAG2"'
....