Bash 在shell脚本中传递变量以生成CFLAGS?

Bash 在shell脚本中传递变量以生成CFLAGS?,bash,shell,makefile,cflags,Bash,Shell,Makefile,Cflags,我正试图通过一个shell脚本用GNUMake(4.1)构建一些c程序。我想使用不同的CFLAGS参数,从文件中读取。该文件包含以下行: "-O1 -freorder-functions" 我正在尝试做一些类似的事情 while read line do opts="$line" make CFLAGS="$opts" done < $1 cc "-O1 -freorder-functions" -c foo.c 因此,我尝试将文件内容更改为仅在-O1(-freord

我正试图通过一个shell脚本用GNUMake(4.1)构建一些c程序。我想使用不同的CFLAGS参数,从文件中读取。该文件包含以下行:

"-O1 -freorder-functions"
我正在尝试做一些类似的事情

while read line
do
    opts="$line"
    make CFLAGS="$opts"
done < $1
cc "-O1 -freorder-functions" -c foo.c
因此,我尝试将文件内容更改为仅在-O1(-freorder函数)之后的参数,并在shell脚本中添加-O1:

opts=$(printf "\"-O%d %s\"", 1, "$line")
(还有许多其他看起来不太明智的事情)但我仍然得到同样的错误信息

在shell脚本中硬编码要生成的参数效果良好:

make CFLAGS="-O1 -freorder-functions"

抱歉,如果这是一个愚蠢的问题,但我似乎找不到任何这样的例子,而且我对shell脚本还不熟悉,所以我真的不明白它是如何处理这里的变量的。对我来说,我试图传递给CFLAGS的内容的回音看起来没问题。

在文件中的标志周围加上双引号,并且您尽职尽责地正确引用shell变量,您的
make
调用最终会失败

make CFLAGS="\"-O1 -freorder-functions\""
也就是说,在标志中使用双引号。这一直传递到编译器调用,这意味着编译器调用类似于

while read line
do
    opts="$line"
    make CFLAGS="$opts"
done < $1
cc "-O1 -freorder-functions" -c foo.c
…它要求编译器使用优化级别
1-freorder函数
,它抱怨这是无效的


为了解决这个问题,我将从文件中删除引号。您也可以将
opts=$line
$line
一起使用,但这并不完全安全。

谢谢,这让我了解了可能发生的情况。但是,在第二种情况下,我已经从文件中删除了引号,因此\“in printf.如果没有引号,在$(printf)-O%d%s,1,“$line”)中,它将-O视为printf的一个选项。opts=$line不幸地将“-freorder functions”视为“-f”,并查找名为“reorder functions”的文件。使用
$(printf--O%d%s“1”$line”)
。按照约定,GNU coreutils中的
-
printf
遵循此约定后,选项处理将停止。