2016-06-22 143 views
0

我曾尝试在makefile中放入以下命令。在sed命令中使用makefile变量

#get Local Ip Address 
LOCALIP=$(shell ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | awk '{print $1}') & 

#get Web Url from User 
@read -p "Enter Web Url:" weburl; \ 

sed -e "\|$LOCALIP $weburl|h; \${x;s|$LOCALIP $weburl||;{g;t};a\\" -e "$LOCALIP $weburl" -e "}" hosts.txt 

当我尝试执行命令,我有望获得sed命令类似如下:

sed -e "\|192.168.5.1 www.weburl.com|h; \${x;s|192.168.5.1 www.weburl.com||;{g;t};a\\" -e "192.168.5.1 www.weburl.com" -e "}" hosts.txt 

不过,我得到以下,

sed -e "\|/s/$/OCALIP eburl|h; \" hosts.txt 
+1

Makefile变量通常包含在'$(...)'中。 –

+0

我试过了。现在我得到以下。 sed -e“\ | 192.168.5.1 & |h; \”hosts.txt –

+1

而不是试图将所有这些shell语句转换为Makefile语法,您不能将它们放入脚本并从Makefile调用该脚本吗? – oliv

回答

0

在Makefile中,变量需要用${varname}而不是$varname来扩展比单个字符更长的字符(即所有可能定义的变量)。正如您发现的那样,后者将导致值$v与字符串arname串联。

我不会开始作为管道看起来有点可疑的解析Makefile文件的其余部分。

+0

不makefile使用'$(varname)',而不是'$ {varname}'? – Barmar

+0

@Barmar两个作品。 GNU Make说“无论是$(foo)'还是''$ {foo}''都是变量'foo'的有效引用,BSD Make只使用手册中的'$ {foo}'。 – Kusalananda

+0

我认为括号是更地道,这些天,[O'Reilly的制作书(http://www.oreilly.com/openbook/make3/book/ch03.pdf)同意。 – Barmar