`
qindongliang1922
  • 浏览: 2171515 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117084
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125431
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59507
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71021
社区版块
存档分类
最新评论

跟散仙学shell编程(七)

阅读更多
上篇散仙在文章里描述了如何处理linux信号和脚本控制,本节我们来看下,如何在linux使用基本的脚本函数,等一些shell的高级用法!

在JAVA里,我们经常在类里面使用方法,正因为类的出现,才使JAVA为面向对象编程,在shell里面虽然没有类的高级特性,但是,基本的函数编程还是存在的。


在linux里面定义方法或函数的两种形式:
一:
function name{
  commands
}
二:
name(){
  commands
}
第二种方法更贴近JAVA里面的写法,而第一种则更贴近JavaScript里面的写法

[search@h1 815]$ cat 1.sh 




fucn1(){

echo "测试方法的例子"


}


for ((  i=1; i<10; i++   ))
do

fucn1


done


echo `date`


fucn1



[search@h1 815]$ sh 1.sh 
测试方法的例子
测试方法的例子
测试方法的例子
测试方法的例子
测试方法的例子
测试方法的例子
测试方法的例子
测试方法的例子
测试方法的例子
2014年 08月 16日 星期六 03:31:26 CST
测试方法的例子

需要注意的是,函数名必须是唯一的,而且定义的函数的顺序也是有序的,不能在函数定义前调用这个函数,如果函数名重复,则默认会覆盖前面的函数,而且不会报错.
[search@h1 815]$ cat 11.sh 


t(){

echo "a"

}



t(){

echo "b"
}


t

[search@h1 815]$ sh 11.sh 
b
[search@h1 815]$ 


在函数里面同样有退出状态码,默认是最后一条命令的状态码,
[search@h1 815]$ cat 2.sh 



f(){

echo "hah"

}

f
echo "状态码: $?"




e(){

ls mmm


}

e

echo "错误的状态码: $?"


[search@h1 815]$ sh 2.sh 
hah
状态码: 0
ls: 无法访问mmm: 没有那个文件或目录
错误的状态码: 2
[search@h1 815]$ 


当然我们也可以使用return命令,返回状态,不过必须在0-255之间:
[search@h1 815]$ cat 22.sh 



a(){



return 20


}



a


echo "返回值:$?"




b(){



return 4000

}


b

echo "返回值: $?"
[search@h1 815]$ sh 22.sh 
返回值:20
返回值: 160
[search@h1 815]$ 

大于255的会被取模返回,如果我们一定要返回某个字符串或数值,也可以,不过得使用另外一种方法,使用一个变量接受方法的值,这一点散仙感觉和JavaScript的写法,非常类似

[search@h1 815]$ cat 3.sh 



a(){



echo  300

}




r1=`a`



b(){



echo  "返回字符串了"


}


r2=`b`



echo "a: $r1"
echo "b: $r2"

[search@h1 815]$ sh 3.sh 
a: 300
b: 返回字符串了
[search@h1 815]$ 




[search@h1 815]$ cat 33.sh 

exec 0>&0


a(){


read -p "输入数字求平方: " num


v=$[ $num * $num   ]


echo  $v


}




b=`a`



echo "结果是:  $b  "
[search@h1 815]$ sh 33.sh 
输入数字求平方: 567
结果是:  321489  
[search@h1 815]$ 


下面看下如何在函数内使用变量,在函数内使用变量必须,在调用时传过去,而不能直接使用shell主体的变量参数:
[search@h1 815]$ cat 12.sh 



add(){


if [ $# -eq 0  ] || [ $# -gt 2    ]

then

   echo -1

elif [ $# -eq 1  ] 

then echo $[ $1 + $1    ]

else
   echo $[ $1 + $2   ]

fi




   



}






v1=`add 10 15`

echo "10+15= $v1"




v2=`add 10`


echo "10+10= $v2"


v3=`add 1 1 1 1`

echo "-1?  $v3"



[search@h1 815]$ sh 12.sh 
10+15= 25
10+10= 20
-1?  -1

下面看下如何在外界动态传入参数:
[search@h1 815]$ cat 13.sh 



add(){


echo $[ $1 + $2  ]



}




if  [ $# -eq 2   ]
then
sum=`add $1 $2`

echo "和=$sum"

else

echo "请输入2个参数"

fi




[search@h1 815]$ sh 12.sh 
10+15= 25
10+10= 20
-1?  -1
[search@h1 815]$ sh 13.sh  
请输入2个参数
[search@h1 815]$ sh 13.sh 25 63
和=88
[search@h1 815]$ sh 13.sh 25 63 85
请输入2个参数
[search@h1 815]$ sh 13.sh 25 
请输入2个参数
[search@h1 815]$ sh 13.sh 25   
请输入2个参数
[search@h1 815]$ sh 13.sh 25   25
和=50
[search@h1 815]$ 


默认情况下,在shell里面的变量都是全局变量,下面我们通过一个例子看下:

[search@h1 815]$ cat 14.sh 



db1(){


value=$[ $value * 2   ]



}




read -p "请输入一个值: " value


db1




echo "变量的值:  $value"

[search@h1 815]$ sh 14.sh 
请输入一个值: 12
变量的值:  24
[search@h1 815]$ sh 14.sh 
请输入一个值: 678
变量的值:  1356
[search@h1 815]$ 


下面看个例子,如果分不清局部,全局变量容易出现一些问题:
[search@h1 815]$ cat 15.sh 



function f(){


temp=$[ $value + 5  ]

result=$[ $temp * 2  ]




}



temp=4
value=6



f

echo " result: $result"


echo "temp: $temp"
echo "value: $value"

if [ $temp -gt $value   ]
then
echo " temp is larger"
else

echo " temp is smaller"

fi
[search@h1 815]$ sh 15.sh 
 result: 22
temp: 11
value: 6
 temp is larger
[search@h1 815]$ 


如果我们想使用局部变量,可以使用local关键字来实现:
[search@h1 815]$ cat 15.sh 



function f(){


local  temp=$[ $value + 5  ]

result=$[ $temp * 2  ]




}



temp=4
value=6



f

echo " result: $result"


echo "temp: $temp"
echo "value: $value"

if [ $temp -gt $value   ]
then
echo " temp is larger"
else

echo " temp is smaller"

fi
[search@h1 815]$ sh 15.sh 
 result: 22
temp: 4
value: 6
 temp is smaller
[search@h1 815]$ 

下面看下如何向函数里面传进数组参数:
[search@h1 815]$ cat 16.sh 



function t(){

echo "参数是:  $@"

array=$1

echo " 数组值=${array[*]}  "


}



myarray=(1 2 3 4 5)


echo " 原生的数组:  ${myarray[*]}"


t $myarray






echo `date`
[search@h1 815]$ sh 16.sh 
 原生的数组:  1 2 3 4 5
参数是:  1
 数组值=1  
2014年 08月 16日 星期六 04:55:00 CST
[search@h1 815]$ 


如果我们将数组作为参数会发现,它只会取第一值,要解决这个问题,就需要重新将数组的值分解,在重组:

[search@h1 815]$ cat 16.sh 



function t(){


echo "参数是:  $@"
local nay
nay=(`echo $@`)


echo " 数组值=${nay[*]}  "


echo "遍历数组"


for tt in ${nay[*]}

do
 echo "值: $tt"


done


}



myarray=(1 2 3 4 5)


echo " 原生的数组:  ${myarray[*]}"


t  ${myarray[*]}






echo `date`
[search@h1 815]$ sh 16.sh 
 原生的数组:  1 2 3 4 5
参数是:  1 2 3 4 5
 数组值=1 2 3 4 5  
遍历数组
值: 1
值: 2
值: 3
值: 4
值: 5
2014年 08月 16日 星期六 05:08:05 CST
[search@h1 815]$ 

下面看下如何从函数里面返回数组:
[search@h1 815]$ cat 21.sh 



t(){



local a=(1 4 5 6)

echo ${a[*]}


}



tt=`t`




for v in $tt
do

echo "值: $v"

done


echo ${tt[*]}
[search@h1 815]$ sh 21.sh 
值: 1
值: 4
值: 5
值: 6
1 4 5 6
[search@h1 815]$ 


利用函数,我们也可以实现函数递归,有兴趣的朋友可以自己尝试下。

下面我们看下如何在linux里面使用库函数,有了库函数,就类似JAVA里面的包了,导入不同的包就可以实现不同的功能:
[search@h1 815]$ sh 4.sh 

值是: 25 
[search@h1 815]$ cat bb


function dd  {
  echo  $[ $1 + $2 ] 
}


[search@h1 815]$ cat 4.sh 

#!/bin/bash



. ./bb


echo $cs

result=`dd 10 15`


echo "值是: $result "
[search@h1 815]$ sh 4.sh 

值是: 25 
[search@h1 815]$ 

.操作符和source作用是一样的

除此之外,我们还可以直接把函数,写在.bashrc文件里,打开终端时就会加载,这样就可以直接在命令窗口里,调用了:
[root@h1 ~]# su - search
欢迎使用!!
[search@h1 ~]$ dd 100 236
336
[search@h1 ~]$ cat .bashrc 
# .bashrc

# Source global definitions



if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

echo "欢迎使用!!"




source /home/search/815/bb
# User specific aliases and functions
[search@h1 ~]$ dd 5 8
13
[search@h1 ~]$ 











0
0
分享到:
评论

相关推荐

    跟老男孩学Linux运维:Shell编程实战 PDF

    跟老男孩学Linux运维:Shell编程实战 PDF跟老男孩学Linux运维:Shell编程实战 PDF

    跟老男孩学Linux运维:Shell编程实战

    《跟老男孩学Linux运维:Shell编程实战》分为五大部分:部分为第1章~第4章,此部分着重介绍新手如何学好Shell编程。涉及的内容包括Shell编程的入门介绍、基础知识、运行原理、编程语法、编程习惯、变量知识以及变量...

    跟老男孩学Linux运维:Shell编程实战.pdf 高清 带书签

    资深运维架构实战专家及教育培训界*专家十多年的运维实战经验总结,全面系统地讲解运维工作中Shell编程所需的知识点和Shell编程的各种企业级案例。

    shell编程入门经典--LINUX与UNIX Shell编程指南 (中文pdf版)

    《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...

    shell编程指南shell编程指南shell编程指南shell编程指南

    Shell编程是一种在Unix/Linux操作系统环境下进行系统管理与自动化任务的强大工具。它允许用户通过命令行接口执行各种操作,包括文件管理、程序控制、系统管理任务等。本指南将深入探讨Shell编程的基础知识、常用命令...

    Windows Shell 编程.pdf

    Windows Shell 编程.pdf 看过一些对windows 外壳的扩展程序,在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对...

    shell编程学习资料

    Shell编程是Linux/Unix系统中不可或缺的一部分,它是一种命令行解释器,允许用户与操作系统进行交互,执行系统命令,以及编写脚本自动化任务。在本文中,我们将深入探讨Shell编程的基础知识,包括基本命令、变量、...

    shell编程入门教程+shell脚本专家指南+UNIX.shell编程24小时教程.rar

    《shell编程入门教程》、《shell脚本专家指南》以及《UNIX.shell编程24小时教程》会提供详尽的实例和练习,帮助你巩固所学并深化理解。 总之,Shell编程是Linux/Unix环境中不可或缺的技能,它能够提高工作效率,...

    shell编程题目练习

    shell编程题目练习,练习基本的shell编程,学习脚本语言,提高效率

    跟老男孩学Linux运维:Shell编程实战 完整版 pdf

    跟老男孩学Linux运维:Shell编程实战 完整版 pdf

    Linux与UNIX Shell编程指南.pdf

    "Linux与UNIX Shell编程指南" Linux与UNIX Shell编程指南是计算机科学领域中一本经典的指南手册,旨在帮助读者快速掌握Linux与UNIX操作系统下的shell编程技术。下面是从该书中生成的相关知识点: 1. Shell概述 ...

    Shell编程高级进阶系列视频.zip

    13Linux下Shell编程之While case演练 14Linux下Shell编程之While case演练 15Shell编程之函数及脚本案例讲解 16Shell编程之函数及脚本案例讲解 17Linux下Shell编程FIND、SED命令实战 18Linux下Shell编程FIND、SED...

    UNIX命令及SHELL编程

    这是一套完整的Unix培训教材,包括Unix常用命令及SHELL编程基础与高级技巧,PDF格式,共30个文件。另有2个Word文档。包内文件清单如下: 01_Shell-文件安全与权限.PDF 02_Shell-使用find和xargs.PDF 03_Shell-...

    Windows Shell 编程指南与实例

    《Windows Shell 编程指南与实例》是一本深入探讨Windows操作系统壳层编程技术的专业书籍。在Windows系统中,Shell指的是用户界面,它为用户提供与操作系统交互的环境,包括桌面、开始菜单、快捷方式等。Shell编程则...

    Shell编程中文手册.pdf

    Shell 编程中文手册 本手册涵盖了 Shell 编程的基础知识,包括 Shell 概述、Shell 解析器、Shell 脚本入门、Shell 中的变量等。 Shell 概述 Shell 是一种命令行接口,允许用户与操作系统进行交互。学习 Shell ...

    Unix Shell Shell编程

    6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书

    shell编程个人笔记

    shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人...

    shell demo及编程pdf

    **Shell编程介绍** Shell编程是Linux/Unix操作系统中的一种脚本语言,用于自动化日常任务,交互式地控制操作系统,以及实现系统级别的程序间交互。它提供了命令行接口(CLI)来执行各种系统命令,使用户能够高效地...

Global site tag (gtag.js) - Google Analytics