UNIX 常用知识系列讲座(三)

Posted by NosaLee in UNIX/Linux on 18-08-2011. Tags: , ,

作者:牧山道人
原文地址:http://www.seeksunslowly.com/unix-basic-lecture-3
转载请注明出处,谢谢。
_____________________________________

笔者根据 7 年多的实作经验编写了该系列讲座,共分为 5 讲,每讲 10 个要点。
这 50 个要点涵盖了操作 UNIX 的必备知识及正确编写 shell 脚本的必要理论,每一要点均附有演示(在本博客中只能略过,实际培训才有办法演示)。

该讲座在之前任职的公司举办过两次,反映非常好,学员都称专业、有用、获益匪浅。
若您或所在企业有现场培训需要(现场培训的效果,您懂的:)),请留下 QQ 及电话,笔者会及时与您商谈。

21、shell 初探

我对 shell 的理解
shell 字面意思是“外壳”,不错,UNIX 中的 shell 也由此引申——它是 UNIX 这个复杂 OS 提供给使用者的一个外壳程序(接口),有了 shell,你就可以通过方便的命令或脚本让 UNIX 为你工作;如果从技术角度看,shell 就是一种解释器——解释你下达的命令及脚本并交由 UNIX 去执行。换个角度讲,没有 shell,一般人是玩不了 UNIX 的。

几种常见 shells
Bourne Shell /bin/sh(一般为默认 shell)
C Shell /bin/csh(语法更接近 C)
Korn Shell /bin/ksh (颇受青睐、强大易用的 shell,建议选择)
注:
1、以上几种 shell 几乎所有 UNIX/Linux 都自带,所以不用担心脚本的可移植性问题。
2、关于以上 shell 的历史、渊源信息,有兴趣可自己上网看看,其背后隐藏着一些有意义的故事和 UNIX 界的历史性人物。
3、建议只选择学习一种,而不要去混杂着学习各种语法,这样会使自己的经验发生混乱。特别建议选择 Korn Shell(我也用这个)。

如何查看自己的默认 shell
方法一:echo $SHELL
方法二:more /etc/passwd

22、正确编写 shell 脚本的第一行
shell script 第一行的作用
Script 中第一个非空白字符不是 # ,使用 Bourne Shell。
Script 中第一个非空白字符是 # 时,但不以 #! 开头时,则它会使用 C Shell。
Script 中前两个非空白字符是 #!,则 #! 后面所写的就是所使用的 Shell,而且要将全路径名称写出来。
强烈建议使用第三种方式指定 Shell ,以确保 script 按你的预期执行。
即,一个专业的 shell script 第一行应为:
#!/usr/bin/ksh 或 #!/usr/bin/sh 或 #!/usr/bin/csh
而不是其他任何字符串(比如注释)。

23、正确编写 shell 脚本的第二行
script 的第二行,没有硬性规定。
但根据个人经验,第二行的标准写法为
. $HOME/.profile
即先执行一下自己的 .profile,以便设置你需要的正确环境(. 表示在原有 process 下执行而不产生新的 process)。比如你耍 java 的,.profile 一定设过路径了,这样你在下面的脚本中调用 java 就不用写全路径了,sqlplus 这样的第三方程序同理。
记住,多数手动执行正常但放 crontab 就不能正常工作的脚本,就是由于没有加这句话造成的(因为手动执行时,你通过登录主机,已经执行过你的 .profile 了)。

小结:根据本讲第二、三个知识点,你已经知道——一个专业、运行良好的 shell script 前两行应写成这样:
#!/usr/bin/ksh
. $HOME/.profile

请大家养成这个习惯,避免经常出现一些纠结的环境问题。
第三行开始就可以写脚本注释实现业务逻辑了。

24、script 的参数使用

传递参数 就像使用 UNIX 命令一样,在 script 名称后以空格分隔各参数即可。如:
test.ksh pa pb pc

取用参数
参数传入后,如何取用呢?请使用下面几个特殊变量:
$0 script 文件名。
$n script 第 n 个参数值,n=1…9。
$* script 的所有参数值。
$# script 的参数个数。

演示

25、在 script 中使用变量
声明 无须。
类型 全视为字符串。
赋值
方式一:var=”test”(注意,= 两边不能有空格)。
方式二:var=`echo “test”`(注意反引号表示取命令输出,如此就可以无限扩展)。
方式三:echo “test” | read var(即组合使用 read 命令及管道将命令输出读入 var,也具无限扩展性)。
取用 使用变量取用符 $。
注意 变量值中若存在空格,或为了在连续字符串中明确界定变量名称,应使用 ${} 形式。如:
$var
${var}
建议 统一使用 ${} 引用,以避免 script 中出现不必要的 bugs。
演示

26、script 调试
由于 shell script 依耐于 UNIX 环境而执行,目前尚无像那些优秀 IDE 的断点调试工具功能。
建议使用 echo 命令输出中间结果调试。
另一种方式 ksh -x script.ksh 会将脚本本身与其中间结果一并输出,看似强大,对有经验的 script 玩家并不实用,反而会增加排错负担。

演示

27、执行命令而不影响当前工作

& – 将命令置于后台执行,从而让你可以继续干其他的事。如:cmd &
nohup – 即使退出会话,程序仍然继续为你工作。如:nohup cmd
组合使用 – 执行命令不影响你的当前工作,并且可以自由退出会话。如:nohup cmd &
手工执行耗时较久的程序,建议使用第三种方式(UNIX 服务器掉电、HANG、DOWN 的机率毕竟比你的 PC 要小得多)。

演示

28、script 中如何使用外部交互式命令(或软件)
shell script 之所以强大,还在于它博大的胸襟——可以自由使用外部交互式命令(或软件,如 sqlplus,ftp),从而大大提升其可编程能力。

格式
Command << Symbol ... Any Commands ... Symbol 举例 sqlplus rasbkg/****@ynras << SQL SELECT 1 FROM dual; EXIT; SQL 注意 1、<< Symbol 的格式及位置。 2、在 << Symbol 后还可用辅以管道符(|)或输出符(>,>>),极为方便灵活。
3、两个 Symbol 间不能有 shell 注释符 #,除非该软件也用 # 作注释。
4、可在 Symbol 间任意引用 shell 变量(凡遇 $ 一律执行宏替换)。

演示

29、日常工作及 script 常用命令 sort
功能 排序。
-u 剃重(常用)。
-r 逆序。
-n 按数值排序。
演示

30、压缩与解压
compress file.tar 压缩 file.tar 文件为 file.tar.Z。
uncompress file.tar.Z 解压 file.tar.Z 为 file.tar。
gzip -p filename
-9 采用最高压缩比进行压缩(压缩后的文件后缀为 .gz)。
-d 解压一个压缩档(可解压 .gz 及 .Z 档)。
gunzip 等价于 gzip -d。
建议使用 gzip,更简洁,强大。

演示

Post a comment