Linux Shell编程step by step--文本文件最后两行相减

作者: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
$!                 前一个后台命令的进程号

你可能感兴趣的:(Unix类)