使用时MK,GNU sed,我发现变量根本不扩展。
有问题的代码:
VAR=qux
...
build:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
这似乎运行以下内容:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
当我想要它运行时
sed -i "s|FOO = .*|FOO = qux|" bar.file
正如其他堆栈交换帖子所提到的那样,我尝试过使用单引号和双引号。我可以扩展的唯一实例$VAR
是当它周围没有引号时。这当然意味着sed
不再将表达式视为表达式。
答案1
这看起来像 Makefile 中的一个片段。
文件中有两个错误:
替换命令
sed
使用|
作为分隔符,但中间分隔符是/
。Makefile 变量
VAR
被取消引用,而$VAR
不是$(VAR)
or${VAR}
。
请注意,Makefile 不是 shell 脚本。因此,以下 Makefile 完全有效,并将生成字符串qux world
作为终端上的输出:
VAR= qux
build:
@echo 'hello world' | sed 's|hello|$(VAR)|'
在 Unix Makefile 中,$VAR
将扩展为变量的值,V
后跟字母AR
。这是因为除非另有说明,变量的名称都是单个字符。如果您有多字符变量名称,则必须将整个名称括在 或$(...)
中${...}
。
显然,Plan9 Makefiles 在这方面可能有所不同。
更新:
使用2.0 时,以下mkfile
输出正确的值:mk
hello = qux
VAR=qux
all:
echo "hello = bar" | sed "s/= bar/= $VAR/"
所以问题中的引用对我来说似乎是正确的。
答案2
事实证明,虽然我之前尝试过转义它,但我错误地在它周围加上了双引号,如下所示:
sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file
将其更改为
sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file
作品。