最近在接触一些Unix Shell的东西,在这个过程中看了不少书籍资料,也受了不少折腾,因此这里把一些需要注意的细节记录下来以作备忘和提醒。这里的Shell是指Bourne Shell,其它类型的Shell我没有用过因此不知道是否存在相同问题。
另外Unix Shell的基础资料这里也不多介绍,其实网上的相关资料是比较散,加之Shell本身牵扯的东西也比较多,其中包括Unix的系统知识,不同版本Shell的语法和功能,正则表达式,管道什么,要一次说清楚也不容易。这里推荐一本书《UNIX shell范例精解》,在学习Shell的过程中它确实帮了不少忙。好,开始备忘。
1、关于Unix Shell环境变量
环境变量的作用域是由上到下的,并且在子进程里改变了环境变量是不会传递回父进程。因此在全局使用的环境变量应该在父进程里定义,子进程或者其它进程定义的环境变量不会能共享访问。环境变量的这个特性对Shell程序的结构有很大的影响。因为如果要使用环境变量作为全局变量使用,那么Shell脚本程序之间就必须保持一种至上向下的调用关系。
Unix Shelll里面没有全局变量的概念,只有环境变量和局部变量。全局变量的解决方案有这么几种:
a.使Shell脚本之间保持一个至上向下的调用关系,然后在父进程中定义环境变量;
b.使用只读局部变量,然后保证所有脚本在同一进程下执行;
c.保存变量在一个config文件内,脚本执行加载;
或者这里说到的全局变量有点常量的味道,毕竟全局变量是可以在过程之间共享信息的,但是上面提及的方法都不可以。如果要过程之间通信估计只有通过参数和返回值了。真正意义上的全局变量怎么实现暂不做探讨。
其实把环境变量加载到Unix的主进程中也可以把它直接当全局变量使用,这个方法是***个方案的特殊使用。
2、使用“.”调用脚本***放在接收参数之后,不然可能会引起“$#”这些特殊变量的值的改变
3、if语句中使用“[]”替换test时,要注意“[]”使用是的空格,例如:if [ "$a" != "" ] then #空格不能省略
4、cp -R 时,要注意目标路径中不需要提供复制后的目录名,例如:cp -R /a /b/ 这样将会把a目录复制到b目录中,复制后的目录仍叫a(此处与xcopy有差别)
另外,cp并不会自动建立目标目录。
5、使用while读取文件时要注意 当使用
- while read line
- do
- #####
- done < file
读取文件时,发现文件***一行不会在while内读取。这个问题不知道是不是上面代码的写法问题。这就是这次关于Unix Shell中的知识的讲解。
【编辑推荐】