shell学习三----function


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

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

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

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

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

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

给一个例子

#!/bin/bash
echo $1
echo $#
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

结果:

tt
3
hello world
1+2 param is so so 
./bs
4
echo tt jj dd

函数参数调用:

aa.sh

#!/bin/bash

echo 'start'
echo 'end'

function hello()
{
        echo $1
        echo "hello world"
}

hello


for i in {1..100}
do
        hello aaa
done

执行sh aa.sh,结果:

hello world
aaa
hello world
aaa
hello world
aaa
hello world
aaa
hello world
aaa
hello world
aaa
hello world
aaa
hello world
aaa
hello world
aaa
hello world
aaa
hello world
.
.
.
.
.
.



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

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

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

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

贴一个shell脚本:

#!/bin/bash
datapath=/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


你可能感兴趣的:(Web,shell,function,脚本)