Makefile VS shell

来源:互联网 发布:sp最短路径优先算法 编辑:程序博客网 时间:2024/05/29 18:18

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

        

              Shellshell又变心了,开始用"[]"限制条件,刻薄的中括号,使每一个条件都需要空格分离,实在

                           是太花心,所以还需要用"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"了

                         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<