作者:fbysss
msn:[email protected]
blog:blog.csdn.net/fbysss
声明:本文由fbysss整理编写,转载请注明出处
关键字:shell编程
背景
同事求助。
需求
一个文本文件,要得到最后一行与倒数第一行相减的结果。
测试文本
#vi test.txt
内容如下:
10
7
9
1
6
脚本
$vi rowSubstract.sh
内容如下:
#脚本注解,用于指明脚本类型是bash。这样,能保证不在bash的脚本环境,执行也没有问题。
#查看当前脚本环境:echo $SHELL。或者简单使用ps命令也可以。
#在linux下, #!/bin/sh和 #!/bin/bash几乎是一样的。
#!/bin/sh
#参数个数检查
#其中,$0为命令本身,$1-$n为参数,$#为参数个数
#if 和 fi成对进行判断
#if后面、[右边和]左边都必须有空格,then 前面需要有分号;
#如果不满足条件,返回一个状态码(必须在0-255之间),一般正确的返回0,错误的返回其他数字
#判断数字,必须使用eq ne gt lt等逻辑运算符,如果是字符串,则要使用=或者== ,!= ,>= ,<=来判断(符号,包括运算符两边必须有空格,赋值的等号却不能有空格)
if [ $# -ne 1 ] ; then
echo 'useage:$0 [filename]'
exit 1
fi
#用一个可读性较高的变量来替代$1
filename=$1
#参数有效性检查,注意感叹号!前后都要有空格,表示逻辑取反。-f 表示是否存在这个文件 -d判断目录。
if [ ! -f $filename ] ;then
echo 'file ' $filename 'not found,please check the filename.'
exit 2;
fi
#得到文本行数;wc -l用来统计行数
#``(注意不是单引号,而是键盘左上角,Esc下方,与波浪号在一起的键)中间的内容,相当于去执行里面的命令,得出一个结果
rowcount=`cat $filename|wc -l`
lastrowvalue=`tail -1 $filename`#得到最后一行的内容
seclastrownum=`expr $rowcount - 1`#得到倒数第二行的行号,其中,expr 为表达式运算,运算符左右都要有空格,变量等号和赋值之间不要有空格
seclastrowvalue=`sed -n $seclastrownum'p' $filename`#得到倒数第二行的内容。其中,$num'p' 的形式是为了连接变量和p命令
echo `expr $lastrowvalue - $seclastrowvalue#最后一行减去倒数第二行数值的运算结果
$chmod 755 rowSubstract.sh
$./rowSubstract.sh test.txt
结果为
5
其他知识:
1.单引号和双引号:单引号里面,一律认为是特殊字符,比如param='help',echo '$param'输出为$param,echo "$param"为help。
2.一些变量
$0 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径
$n 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2...)
$# 提供脚本的参数号
$* 所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2
$@ 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2
$? 前一个命令执行后的退出状态
$$ 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID
$! 前一个后台命令的进程号