linux命令详解(14)shell脚本学习,创建简单的shell脚本

2014-12-8 17:30:01     11 人阅读    

创建简单的shell脚本
shell脚本非常适合自动执行重复的任务。bash和其他shell包含各种编程语言里常见的基本结构,如循环、测试、case语句等。主要区别在于shell只有一种变量:字符串。
编辑和运行脚本
shell脚本是纯文本文件,可以选用自己喜欢的文本编辑器(如vi)创建。例如,首先创建文件名为myscript.sh的shell脚本,然后执行如下命令将其设为可执行文件:
$ chmod u+x myscript.sh
另外,bash脚本第一行始终为:
#!/bin/bash
和其他命令一样,除可执行外,创建的shell脚本还必须位于PATH路径,或在运行时给出脚本的完整或相对路径。换言之,直接运行上面的脚本,大概会看到下面的结果:
$ myscript.sh
bash: myscript.sh: command not found
在这个示例中,PATH路径并不包含myscript.sh所在目录。如要修正这个问题,要么编辑自己的路径,将该脚本拷贝到位于PATH路径的某个目录,要么输入脚本的完整路径或相对路径,如下所示:
$ mkdir ~/bin ; cp myscript.sh ~/bin/ ; PATH=$PATH:~/bin
$ cp myscript.sh /usr/local/bin
$ ./myscript.sh
$ /tmp/myscript.sh
不要将点号(.)加到PATH路径里,即命令可以直接从当前目录运行。否则,如果当前目录下有命令与常用的重要命令(如ls或cat)同名,这些命令就会取代那些同名的重要命令。
编写功能更强的脚本
shell脚本可以只是一连串的命令,也能像程序设计语言那样使用。例如,脚本根据不同的输入产生不同的结果。本节介绍如何在shell脚本里使用复合命令,如if/then语句、case语句和for/while循环等。

下面的示例代码会将字符串abc赋给变量MYSTRING,然后测试输入是否与abc相等,并根据测试结果执行不同的动作。方括号([  ])里的代码会测试变量:
MYSTRING=abc
if [ $MYSTRING = abc ] ; then
echo “The variable is abc”
fi
使用!=而非上面的=可以做不等测试,如下所示:
if [ $MYSTRING != abc ] ; then
echo “$MYSTRING is not abc”;
fi
下面的代码会测试数字:
MYNUMBER=1
if [ $MYNUMBER -eq 1 ] ; then echo “MYNUMBER equals 1”; fi
if [ $MYNUMBER -lt 2 ] ; then echo “MYNUMBER <2”; fi
if [ $MYNUMBER -le 1 ] ; then echo “MYNUMBER <=1”; fi
if [ $MYNUMBER -gt 0 ] ; then echo “MYNUMBER >0”; fi
if [ $MYNUMBER -ge 1 ] ; then echo “MYNUMBER >=1”; fi
接下来介绍一些针对文件名的测试。下面这段示例代码能检查文件是否存在(-e),属于普通文件(-f)还是目录(-d)。这些检查都用if/then语句完成。若这些检查都不匹配,则由else语句产生最终结果。
filename=”$HOME”
if [ -e $filename ] ; then echo “$filename exists”; fi
if [ -f “$filename” ] ; then
   echo “$filename is a regular file”
elif [ -d “$filename” ] ; then
   echo “$filename is a directory”
else
   echo “I have no idea what $filename is”
fi
表3-1给出了一些针对文件、字符串和变量的测试。
表3-1:用于测试表达式的运算符
运算符
执行的测试
-a file
检查文件是否存在(与-e同)
-b file
检查文件是否为特殊块设备
-c file
检查文件是否为特殊字符设备
-d file
检查文件是否为目录
-e file
检查文件是否存在(与-a同)
-f file
检查文件是否存在,是否为普通文件(例如,不是目录、套接字、管道、链接或设备文件)
-g file
检查文件属性位set-group-id是否置1
-h file
检查文件是否为符号链接(与-L同)
-k file
检查文件是否设置了粘滞位(sticky bit)
-L file
检查文件是否为符号连接(与-h同)
-n string
检查字符串长度是否大于0字节
-O file
检查用户是否拥有该文件
-p file
检查文件是否为命名管道
-r file
检查文件(对用户)是否可读
-s file
检查文件是否存在且长度大于0字节
-S file
检查文件是否存在且为套接字(socket)
-t fd
检查文件描述符是否与终端相连
-u file
检查文件属性位set-user-id是否置1
-w file
检查文件(对用户)是否可写
-x file
检查文件(对用户)是否可执行
-z string
检查字符串长度是否为0字节
expr1 -a expr2
检查两个表达式是否皆为真
expr1 -o expr2
检查两个表达式是否至少有一个为真
file1 -nt file2
检查第一个文件是否比第二个文件新(利用修改时戳)
file1 -ot file2
检查第一个文件是否比第二个文件旧(利用修改时戳)
file1 -ef file2
检查两个文件是否由链接关联在一起(硬链接或符号链接)
var1 = var2
检查第一个变量与第二个变量是否相等
var1 -eq var2
检查第一个变量与第二个变量是否相等
var1 -ge var2
检查第一个变量是否大于或等于第二个变量
var1 -gt var2
检查第一个变量是否大于第二个变量
var1 -le var2
检查第一个变量是否小于或等于第二个变量
var1 -lt var2
检查第一个变量是否小于第二个变量
var1 != var2
var1 -ne var2
检查第一个变量是否不等于第二个变量

另一个常用结构是case语句。使用case语句可以测试各种条件,并根据测试结果采取相应动作。与编程语言里的switch语句类似,case语句可以替代一连串嵌套if语句。
case “$VAR” in
   string1)
      { action1 };;
   string2)
      { action2 };;
   *)
      { default action } ;;
esac
/etc/init.d/目录下的系统启动脚本(initscripts)里包含不少case用法示例。根据传入参数(start、stop等),各个启动脚本会通过一个庞大的case语句选择执行相应动作。
bash shell还支持标准循环结构,详见下面几个示例。在第一个例子中,NUMBER变量的所有值(0到9)都放在for语句里:
for NUMBER in 0 1 2 3 4 5 6 7 8 9
do
   echo The number is $NUMBER
done
在下面的例子中,ls命令的输出(一列文件)提供了供for语句操作的变量:
for FILE in `/bin/ls`; do echo $FILE; done
除了将整列值传给for语句,还可以选择在while循环里不断递增某个值,直到满足特定条件。在下面的例子中,VAR初始值为0,并在while循环里不断递增,直到VAR值变成3:
”VAR=0”
while [ $VAR -lt 3 ]; do
   echo $VAR
   VAR=$[$VAR+1]
done
另一种做法是使用until语句,效果与while语句相同,如下所示:
“VAR=0”
until [ $VAR -eq 3 ]; do echo $VAR; VAR=$[$VAR+1]; done
刚开始接触shell编程的话,推荐阅读《Bash初学者指南》(Bash Guide for Beginners,http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html,译注:中文版http://xiaowang.net/bgb-cn/)。利用该指南,辅之以bash手册页等参考资料,可以逐步掌握大量非常实用的shell脚本编写技巧。

本文是作者在读取《linux命令详解手册》之后的随手笔记,如果大家喜欢这本书,可以去购买


原文地址:http://www.itmmd.com/201412/279.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

linux命令详解(15)文件和目录操作 touch 、file、mkdir、ln、mknod、mkfifo命令详解   上一篇
下一篇  大型网站架构设计-HBase 简单操作API

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!