Makefile VS shell
首先说说Makefile是不是脚本?
其实Makefile和shell一样都是写完就可以运行,无需编译,所以只要不是在进行计算机等级考试,那么,就当脚本吧,何必苦苦分析其归属呢,反正都是Linux的子孙后代。
Makefile和shell 紧密相连,而且众多语法类似但又有其区别,所以很多兄弟姐妹们都苦于编写时的种种异常,以下我就列出比较普遍且很重要的语法特点进行比较吧。
一.Makefile和Shell的独角戏:
1.赋值:
Makefile:
洁癖啊,一定要用空格分开variable和Value;
Name空格=空格"Makefile"
Shell:
亲密型,variable和Value一定要紧密相连;
Name="Shell"
2.引用变量:变量都喜欢钱,所以用变量一定要给钱,“$”开头
Makefile:专一,引用变量时必须用()抱住变量,不抱住的话,变量会掉脑袋哦。
Who空格=空格$(Name)
Shell:就像shell这个英文单词,含有太多意思,太花心,所以他用变量时可以用花括号{}抱住,
甚至不抱住变量。
Who=${Name} or Who=$Name
3.判断语句:
Makefile:始终专一,"()"是他们环抱条件的唯一选择
ifeq空格($(Name), makefile)
...
else
...
endif
Shell:shell又变心了,开始用"[]"限制条件,刻薄的中括号,使每一个条件都需要空格分离,实在
是太花心,所以还需要用"then"多考虑一下该选择哪一个。
if空格[空格expression空格]
then
...
else
....
fi
二.Makefile和Shell神交时:
Makefile对Shell既是喜欢又有禁锢,爱的颇纠结啊。
典型的MakeFile文法结构:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Name ="Makefile"
target ... :prerequisites ...
command
Shell脚本
...
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1.Makefile留给shell的行宫(target)
注意啰:shell语句只能用在target目标中哦。写在其他地方,Makefile对他是置之不理的;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Name ="Makefile"
echo$(Name) //echo你好淘气哦,你只能在target中生效,在这里是不会有任何输出的哦。
target ... :prerequisites ...
echo${Name} //在这里就是小乖乖了;Target是shell的一片净土,Shell的花心语法可以
完全应用其中;看到没,引用这个Makefile定义的变量,使用了shell
的语法“{}”;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
2.Shell在Makefile行宫中受到的限制
记得Makefile是有洁癖的家伙吧,所以怎么可能让shell在行宫中自由散漫呢;
请看Makefile以下的手段:
Target中的每一行Shell语句将以独立的进程运行;
如果下一行再执行一个Shell语句,那么将创建新的进程;两行的Shell语句没有交互性;
如果两行的shell想相互关联,那么请将 ";\"放在行尾。
看看以下经典例子吧:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Name ="Makefile"
target ... :prerequisites ...
Name="shell" //看起来Name的Value被修改了,可真是这样吗?
echo${Name} //echo出的结果还是“Makefile”,因为上一句的修改,被控制在了那一
行所对应的Shell进程中,不会影响到Makefile中的Name。
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Name ="Makefile"
target ... :prerequisites ...
Name="shell";\ //看到没,用";\"将三行连接起来,形成了一行Shell脚本。
echo${Name};\ //echo出的结果还是“Makefile”,因为此句输出的是Makefile中的Name,
如果想用Shell自己定义的Name,没那么容易哦,天下没有免费的午餐,
请看下一句;
echo$${Name}; //MakeFile给了Shell在行宫中引用Shell自己变量的方法,多付点美钞
钱吧,“$$”开头就可以了,这样echo出的结果就是"shell"了
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<