如果软件版本包含特定的版本字符串,我试图传递额外的标志来使用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"
答案 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"'
....