Unix Bourne Shell 注意问题备忘

      最近在搞Unix Shell的东西,在这个过程中看了不少书籍资料,也受了不少折腾,因此这里把一些需要注意的细节记录下来以作备忘和提醒。这里的Shell是指Bourne Shell,其它类型的Shell我没有用过因此不知道是否存在相同问题。另外Unix Shell的基础资料这里也不多介绍,其实网上的相关资料是比较散,加之Shell本身牵扯的东西也比较多,其中包括Unix的系统知识,不同版本Shell的语法和功能,正则表达式,管道什么,要一次说清楚也不容易。这里推荐一本书《UNIX shell范例精解》,在学习Shell的过程中它确实帮了不少忙。好,开始备忘~

1、关于环境变量
      环境变量的作用域是由上到下的,并且在子进程里改变了环境变量是不会传递回父进程。因此在全局使用的环境变量应该在父进程里定义,子进程或者其它进程定义的环境变量不会能共享访问。环境变量的这个特性对Shell程序的结构有很大的影响。因为如果要使用环境变量作为全局变量使用,那么Shell脚本程序之间就必须保持一种至上向下的调用关系。
      Shell里面没有全局变量的概念,只有环境变量和局部变量。全局变量的解决方案有这么几种:
             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内读取。这个问题不知道是不是上面代码的写法问题....


6、“()”“{}”的特殊作用

留意以下取得脚本所在路径的方法:currdir=$(cd "$(dirname "$0")"; pwd)

这个语句的作用是返回当前执行脚本的所在路径,而不是执行路径。其中“()”的意思为将dirname、cd、pwd等几个命令作为子进程执行,但不将改变进程的上下文。从上面的例子来分析,因为有两个嵌套的括号,脚本先执行$(dirname "$0")。$0为当前执行脚本的名称,dirname $0为取得脚本所在的路径(绝对或相对路径,这个取决于你怎样调用执行脚本)。$(cd "**"; pwd),嵌套外语句作用的很明显,就是进入某个路径,然后返回该路径的绝对路径。前面提到“()”是隔断上下文的。所以$(cd "**"; pwd)这里的cd命令并不会改变执行脚本的当前路径。整个语句的原理就大概是这么一回事。

说回来,“()”的作用就是将语句编组为语句块,然后启动子进程运行该语句块,子进程改变的上下文不会被传递回当前进程。

而“{}”的作用与“()”类似,但是它是回将上下文的改变传递会当前进程的,更直接的说就是,“{}”与当前进程使用同一个进程环境。

7、注意windows和unix文件格式的区别

windows里面,文件的行识别符是"\r\n",在Unix中,是“\n”。如果shell脚本使用了,windows格式,将不能运行。如果脚本使用配置文件,在格式问题也会影响脚本识别配置文件字符串。

8、grep、awk、sed是很强大的命令,将他们和其它命令,通过管道组合起来,可以完成很多复杂的任务。

 

9、一些Shell相关资料和手册:

 R2's  Shell  Tutorials

http://www.injunea.demon.co.uk/index.htm

Unix Power Tools

http://docstore.mik.ua/orelly/unix/upt/index.htm

posted on 2008-09-13 15:54  baoli  阅读(494)  评论(0编辑  收藏  举报

导航