SHELL脚本
Posted 数字后端设计及CAD流程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SHELL脚本相关的知识,希望对你有一定的参考价值。
本来想写Makefile的define命令包等内容,可是里面涉及到很多Shell的命令,所以这里先简单介绍一下SHELL脚本的编写。S。本人并没有太多的SHELL脚本经验,大部分脚本还是用tcl/perl写的。所以这里就只简单介绍一些比较重要或常用的东西。至于更深更有用的东西还请大家指教。大家也可以多看看其他书籍。
我们接触到的Shell主要是两种,一种是BASH,一种是CSH,两者类似,但是却很不一样。我这里不打算对这进行太多区分,感兴趣的可以自己比较一下。
特殊变量$$
可能大家经常会在terminal敲入bash/csh这个命令。这就好像就是人畜无害的命令一样。岂不知你已经跳入了第N层的bash/csh中。啥?好像不明白?试试在你的terminal下运行下面命令:
echo $$
csh
echo $$
exit
echo $$
看看都输出什么结果。$$表示当前的的PID。在某个PID下定义的变量都只能在该PID内使用。PID是个很有用的东西,比如说你要在当前terminal下执行一个程序,这个程序的log文件就可以加入PID来表示这个是某次运行的结果。
特殊变量$?
在CSH(注意,这里是CSH)里面运行以下命令(中间不要加任何其他命令)
aa=bb
echo $aa
echo $?
unset aa
echo $aa
echo $?
看到$?返回的结果了么 第一次返回了0,第二次返回了1。这个特殊变量也很有用,其结果就是上次命令的返回值:0表示正常,1表示异常。
test 和 []
一般检测文件是否存在,两个变量是否相等,有两种方法,一种是用[];另一种是用test命令。如下面两图所示,需要注意的是[] 前后都要有空格!
这里-e用来判断文件是否存在,还有很多option:
-d 判断是否为目录 -nt/-ot用于判断哪个文件更老,例如:
test afile -nt bfile
test afile -ot bfile
数字的比较
test 3 -gt 2
test 3 -lt 2
test 3 -eq 2
test 3 -ne 2
还有-a -o 等同于and/or,例如:
test -r file -a -x file
即:test -r file and test -x file
test -r file -o -x file
即:test -r file or test -x file
当然还有字符串比较== != =~ !~等等,大家可以多练习练习。
if else 流程控制
如上图所示,第一种是最明白的写法。
写法有千千万,但是为了更好阅读,还是建议写成第二种。当然我说的并不是必须这样做,但是建议大家这样做,以避免一些问题。记住“\”后面千万不能加空格!(如果在makefile里面你随便加空格试试看?)
case 流程控制
大家可照着练习练习,更多的用法还是自己多看看书更好。上面提到的只是BASH里的流程控制命令,CSH里的语法与命令不一样。Makefile里的define定义的命令包使用BASH执行的,所以学习好BASH的命令对Makefile编写至关重要。
以上是关于SHELL脚本的主要内容,如果未能解决你的问题,请参考以下文章