shell学习三----function

来源:互联网 发布:java date转换成月 编辑:程序博客网 时间:2024/04/28 05:59


学习一个问题,一定要知道如何输入,如何执行,如何分析结果。所以重点考虑这三个地方,其余的自己会使用了,就能体会了。

(1)shell的方法的目的是:是程序模块化,增加复用性等。

(2)shell方法的格式:hello(){ }  或  function hello { } 或 function hello() { }

(3)输入格式与执行方式:绝对路径。如./hello    或 /root/program/hello

               可以带参数  如: ./hello tt jj dd

注意的是不要使用sh hello的方式。

给一个例子

#!/bin/bashecho $1echo $#allparam="echo $@"   #获取所有的参值function hello(){  echo "hello world";  local param="1+2";  echo $param "param is so so "  echo $0;           #第一个参数值,即命令            echo $#;           #参数的个数  echo $@;           #除命令以外的所有参数}hello $allparam

输出 ./bs tt jj dd

结果:

tt3hello world1+2 param is so so ./bs4echo tt jj dd

函数参数调用:

aa.sh

#!/bin/bashecho 'start'echo 'end'function hello(){        echo $1        echo "hello world"}hellofor i in {1..100}do        hello aaadone

执行sh aa.sh,结果:

hello worldaaahello worldaaahello worldaaahello worldaaahello worldaaahello worldaaahello worldaaahello worldaaahello worldaaahello worldaaahello world......



这里顺便说一个写shell脚本时遇到的问题

使用``````这个符号时。

有些命令要写在``中间才能执行,如:

`ls /root/data/` 才可以执行及赋值,而`cd /root/data/` 就不能正常运行,要去掉``才可以,变成:cd /root/data/

贴一个shell脚本:

#!/bin/bashdatapath=/usr/data/for a in `ls $datapath | grep x`do        cd $datapath/$a;        for h in `ls | grep '^x'`        do                /opt/jdk1.6.0_29/bin/java -jar /usr/data/myJava.jar $h "web"$h;                `rm -f $h`;        done        cd ..done




执行crontab -e中的shell脚本时,总会出现乱码的问题,这是为啥呢?因为crontab会使得命令没有环境变量的执行。因此在脚本中要增加脚本内容设置环境变量。

这里是解决中文乱码问题:

#!/bin/bash

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8




startTime=`date +"%s%N" | cut -c1-13`;
java -jar testOneSet.jar /usr/spider/sinaapp/tempTest/testIdFile  /usr/spider/sinaapp/tempTest/resultFile2;
endTime=`date +"%s%N" | cut -c1-13`;
usetime=`expr $startTime - $endTime`;
echo 'start time :' + $startTime;
echo 'end time:' + $endTime;
echo 'use time:'+$usetime;


在网上找了下,发现方法其实很多,这里只是汇总下,再用上我的测试结果

1:使用sed的命令

dfs为带有空行的文件名

A:sed -i '/^\s*$/d' dfs

注:-i选项为不打印出来文件修改后的内容,直接修改了文件,不加-i会打印出修改后的内容,但是文件本身的内容并没改变

B:sed '/^$/d' dfs     

注:^代表开头$代表结尾d删除,这句话代表开头和结尾中间没有任何字符的行,删除

2:用vim命令

看到网友有说g/^\s*$/g可以实现,我试了下发现不行,出现下面不能递归的错误

:g/^\s*$/g                                  
E147: :global 不能递归执行
请按 ENTER 或其它命令继续

但是发现用g/^\s*$/可以打印空行所在的位置

:g/^\s*$/
  4 
  6 
  8 
 11 
 13 
请按 ENTER 或其它命令继续

关于vim下的命令欢迎网友提出更多意见,我知道肯定可以实现的

参照网友的评论得到了方法,我知道sed下用d删除,没想到vim下也是,惭愧....多谢两位评论的网友哈!

vim下删除空行的,命令

:g/^$/d  或者  :g/^\s*$/d


原创粉丝点击