shell脚本通常是在编辑器中编写的。脚本由命令和注释组成。注释跟在#号后面,包括对要执行的操作所提供的注解。
第一行:位于脚本左上角的第一行会指出要用哪个程序来执行脚本中的行。这一行通常写成:#!/bin/sh,#!被称为幻数,内核根据它来确定该用哪个程序来解释脚本中的行。这一行必须位于脚本顶端第一行。
注释:注释是跟在#号后的行,可以自成一行,也可以跟在脚本命令后面与命令共处一行。注释被用来对脚本做注解。
可执行语句与Bourne shell结构:Bourne shell程序由UNIX命令、Bourne shell命令、编程结构和注释组合而成。
执行脚本:如果要运行脚本,就必须指定它的执行权限,可以用chmod命令来设置脚本的执行权限。
读取用户输入
read命令是一个内置命令,用于从终端或文件读取输入。read命令将读取一个输入行,直至遇到换行符。行尾的换行符在读入时将被转换成一个空字符。也可以用read命令来中断程序的运行,直至用户输入一个回车。
算术运算
Bourne shell没有内置算术运算。如果要执行简单的整数算术运算,Bourne shell脚本中最常用的是UNIX的expr命令。如果要执行浮点运算,则可使用awk或bc程序。
expr命令是一个处理表达式的程序,用于计算算术表达式时,expr能执行简单的整数运算,expr的每个参数之间必须用空格分隔。能应用关于结合性和优先级的标准编程规则。
执行更复杂的浮点运算时,bc、awk这些工具很有用。看下面的例子:
[root@centos fuhao]# n=`echo "scale=3; 13 / 2" | bc`
[root@centos fuhao]# echo $n
6.500
echo命令的输出被管道发给程序bc。scale被设为3,scale是打印结果时的小数点后的有效位数。执行的计算是13除以2。整个管道命令被括在双引号中。shell将执行命令替换并将结果赋给变量n。
关于Linux下的计算器,参考这里:http://blog.csdn.net/linco_gp/archive/2009/09/05/4517945.aspx
[root@centos fuhao]# n=`bc << EOF
> scale=3
> 13/2
> EOF`
[root@centos fuhao]# echo $n
6.500
这里用here文档加反斜杠来实现上面相同的功能。命令的结果被赋值给变量n,然后由echo命令显示。
[root@centos fuhao]# product=`awk -v x=2.45 -v y=3.123 'BEGIN{printf "%.2f\n",x*y}'`
[root@centos fuhao]# echo $product
7.65
awk程序从命令行传来的参数列表中获取操作数的值:x=2.45 y=3.123。awk将两个数相乘,然后用printf函数设置好格式并打印结果,精确到小数点后两位。awk命令的输出被赋给变量product。
位置参量和命令行参数
用户可以通过命令行向脚本传递信息。脚本名后(用空白符分隔)每个词都称为参数。可以在脚本中使用位置参量来引用命令行参数,例如:$1代表第一个参数,$2代表第二个参数等等。变量$#用来测试参量的个数,而$*显示所有的参量。可以用set命令来设置或重置位置参量,使用了set命令后之前的所有位置参量都会被清空。
带参数的set命令将重置位置参量。位置参量一旦被重置,原来的参量列表就会丢失。要想清除所有位置参量,可使用命令set --。
[root@centos fuhao]# vi checker
#!/bin/sh
# Scriptname: checker
# Script to demonstrate the use of special variable modifiers and arguments
name=${1:?"requires an argument" }
echo Hello $name
~
特殊变量修饰符:?将检查$1是否有值,如果无值则打印指定信息并退出。
$*和$@有何区别
$*和$@仅在被双引号括起来时有区别。$*被括在双引号中时,位置参量列表就变成单个字符串;而$@被括在双引号中时,每个位置参量都被加上引号,也就是说,每个词都被视作一个单独的字符串。
阅读(1308) | 评论(0) | 转发(0) |