shell的方法在相同的进程内执行,与调用它的脚本一致。对于方法来说,脚本中的所有变量均可见,且不需要执行export。方法中可以创建局部变量,且不影响正在调用的脚本。

1. 定义语法

(1) KornShell中的定义格式为:function name <复合命令>

(2) Bourne shell中的定义格式为: name() <复合命令>

(3) bash允许的格式:function name() <复合命令>

一个参数设置方法的返回码,若没有参数,方法的退出码默认为执行的最后一个命令执行结果。

local为shell中的内置命令,可用于限制方法(以及其子方法)中变量的作用域,但父进程中的变量不会改变。当参数扩展时,使用IFS而非空格将会导致分词。Bash4.0中, local和declare存在一个选项 -A,用于声明关联数组。

例:判断ip是否有效

## 检测Ip是否有效
isvalidip(){
case $ in
"" | *[!-.]* | *[!-]) return ;; ## 空值、非法字符、不以数字结尾,均不符合Ip
esac ## 将IFS设置为点号,但仅限于该方法中
local IFS=. ## 将Ip设为位置参数,分词之后,每个元素变成了参数
set -- $ ## 必须有4个参数,每个元素必须小于256,参数为空时,默认为666
[ $# -eq ] &&
[ ${:-} -le ] &&
[ ${:-} -le ] &&
[ ${:-} -le ] &&
[ ${:-} -le ] &&
}

使用source命令使脚本中的方法在当前shell中有效:. isvalidip

$ for ip in 127.0.0.1 168.260.0.234 123.100.34.32 204.255.122.150
> do
> if isvalidip "$ip"
> then
> printf "%15s: valid\n" "$ip"
> else
> printf "%15s: invalid\n" "$ip"
> fi
> done 127.0.0.1: valid
168.260.0.234: invalid
123.100.34.32: valid
204.255.122.150: valid

2. 复合命令

复合命令可以是一组封装在( ... )或{ ... }中的命令,封装在(( ... ))或[[ ... ]]中的表达式,或者shell的关键词块(case, for, while, select, until)。

例:检查有效整型

valint()  #@ USAGE: valint INTEGER
case ${#-} in ## 接收负数
*[!-]*) echo false;; ## 包含非数字字符
*) echo true;;
esac

   若方法的主体由引号包含,则它将在子shell中执行,并且执行期间产生的变化在退出时不再有效。

$ funky() (nam=nobody; echo "name = $name")
name=Rempelstilskin
$ funky
name = nobody
$ echo "name = $name"
name = Rempelstilskin

3. 获取结果

1) 设置不同的退出码

例:检验整型是否在特定范围

rangecheck()  #@ USAGE: rangecheck int [low  [high]]
if [ "$1" -lt ${:-} ];then ## 数值太小返回1,若无第二个参数,默认为10
return
elif [ "$1" -gt ${:-} ];then ## 数据太大返回0,若无第三个参数,默认为20
return
else
return
fi

2) 打印结果

例:打印环境变量信息

uinfo()  #@ USAGE: uinfo [file]
{
printf "%12s: %s\n" \
USER "${USER:-No value assigned }" \
PWD "${PWD:-No value assigned}" \
COLUMNS "${COLUMNS:-No value assigned}" \
LINES "${LINES:-No value assigned}" \
SHELL "${SHELL:-No value assigned}" \
HOME "${HOME:-No value assigned}" \
TERM "${TERM:-No value assigned}"
} > ${:-/dev/fd/}

3) 结果保存在多个变量中

例:3个整数排序

_max3()  #@ 对3个整数排序,并且分别保存在$_MAX3,$_MID3及$_MIN3中
{
[ $# -ne ] && return
[ $ -gt $ ] && { set -- $ $ $; }
[ $ -gt $ ] && { set -- $ $ $; }
[ $ -gt $ ] && { set -- $ $ $; }
_MAX3=$
_MID3=$
_MIN3=$
printf "%d\t%d\t%d\n" $_MAX3 $_MID3 $_MIN3
} max3() #@ 对3个整数排序并保存在array中
{
declare -n _max3=${:-_MAX3} #@ 当命令行未提供变量名,则默认使用_MAX3
(( $# < )) && return
(( $ > $ )) && set -- "$2" "$1" "$3"
(( $ > $ )) && set -- "$1" "$3" "$2"
(( $ > $ )) && set -- "$2" "$1" "$3"
_max3=( "$3" "$2" "$1" )
}

4. 示例脚本

##
## 设置默认
##
prompt=" ==> "
template='<!DOCTYPY html>
<html lang="en">
<head>
<meta charset=utf->
<title>%s</title>
<link href=%s" rel="stylesheet">
</head>
<body>
<h1>%s</h1>
<div id=main></div>
</body>
</html>
' ##
## 定义shell函数
##
die(){ #@ 描述:打印错误信息,并且以ERROR退出
error=$
shift
[ -n "$*" ] && printf "%s\n" "$*" >&
exit "$error"
} usage(){ #@ 打印脚本使用用途
printf "USAGE: %s HTMLFILE\n" "$progname"
} version(){
printf "%s version %s: " "$progname" "${version:-1}"
} bashversion=${BASH_VERSION%%.*}
if [ ${bashversion:-} -ge ];then
## bash4.x 的read有-i选项,用于提供一个初始值(如下的$)
readline(){
read -ep "${2:-"$prompt"}" -i "$3" "$1"
}
elif [ ${BASHVERSION:-} -ge ];then
readline(){
history -s "$3"
printf "Press up arror to edit default value: '%s'\n" "${2:-none}"
read -ep "${2:-"$prompt"}" "$1"
}
else
readline(){
printf "Press enter for default of '%s'\n" "$3"
printf "%s " "${2:-"$prompt"}"
read
eval "$1=\${REPLY:-"$"}"
}
fi if [ $# -ne ];then
usage
exit
fi filename=$ readline title "Page title: "
readline h1 "Main headline: " "$title"
readline css "Style sheet file: " "${filename%.*}.css" printf "$template" "$title" "$css" "$h1" > "$filename" 
执行示例结果: 
$ bash test.sh test
Page title: hello
Main headline: hello
Style sheet file: test.css
$ cat test
<!DOCTYPY html>
<html lang="en">
<head>
<meta charset=utf->
<title>hello</title>
<link href=test.css" rel="stylesheet">
</head>
<body>
<h1>hello</h1>
<div id=main></div>
</body>
</html>

Bash编程(5) Shell方法的更多相关文章

  1. Linux中bash编程

    bash编程也叫shell编程 预定义变量         $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...

  2. 怎样用 Bash 编程:逻辑操作符和 shell 扩展

    学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...

  3. shell编程===执行shell脚本的四种方法

    使用vim创建一个shell文件,命名 hello.sh #!/bin/bash echo "hello shell !" 在linux中进行加载 chmod +x ./hello ...

  4. [shell] Bash编程总结

    由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试.打包.安装包等.虽然相比C++编程,要简单.傻瓜,但其在类Unix系统中可以大大提高工作的效率.所以在此对脚本编程过程中一些注意事项进 ...

  5. bash编程总结

    bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...

  6. bash编程基础

    bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...

  7. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  8. 怎样用 Bash 编程:语法和工具

    让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇. Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的.每当用户或者系统管理员 ...

  9. CentOS Grub、BASH 故障、解决方法

    简介: Grub 常见的两种故障:Grub.conf 文件丢失.MBR 损坏 ( 不管恢复怎么样,还是先备份好吧 ) 一.Grub.conf 文件丢失 shell > rm -rf /boot/ ...

随机推荐

  1. 给刚玩Hadoop的朋友一些建议

    随着两会中间央视新闻天天说大数据,很多人纷纷开始关注大数据和Hadoop以及数据挖掘和数据可视化了,我现在创业,遇到很多传统数据行业往Hadoop上面去转型的公司和个人,提了很多问题,大多数问题还都是 ...

  2. easyui引入

    <% String path = request.getContextPath()+"/"; out.println("<link href='"+ ...

  3. 算法 UVA 11729

     例2:假设当前小光有n个部下,每个部下需要完成一项任务.第i个部下需要小光花Bi分钟交代任务,然后他会立刻独立地.无间断地执行Ji分钟后完成任务.小光需要选择交代任务的顺序,使得所有任务尽早执行完毕 ...

  4. pageadmin CMS Sql新建数据库和用户名教程

    用pageadmin网站制作如何Sql新建数据库和用户名 sql server软件安装完毕后,需要新建一个数据库用来作为网站的数据库. 1.打开sql管理界面,如图所示,找到数据库,右键单击数据库,选 ...

  5. 初学python - 脚本文件

    解析:   第一行 #!/usr/bin/env python - py脚本运行环境[用python解释器解释脚本文件-对应python安装路径] 第二行 #-*-coding:utf-8-*- - ...

  6. android 中如何模拟back键

    主要是在使用Fragment时能够返回前一级,所以才找到了这些资料. 有两种方式可以实现,直接上代码 方法1: public void onBack(){ new Thread(){ public v ...

  7. 洛谷P5050 【模板】多项式多点求值

    传送门 人傻常数大.jpg 因为求逆的时候没清零结果调了几个小时-- 前置芝士 多项式除法,多项式求逆 什么?你不会?左转你谷模板区,包教包会 题解 首先我们要知道一个结论\[f(x_0)\equiv ...

  8. Linux Shell 自动化之让文本飞

    Linux Shell 自动化之让文本飞 一.前言: ​ 作者之前在一家 IDC 从事运维兼职工作,后来因某些原因辞职开始 Python 爬虫数据分析.因为这些经历以及后续时间积累下的经验,发现好像自 ...

  9. ArchLinux 下 virtualbox 报错 libQtCore.so.4: cannot open shared object file

    VirtualBox: supR3HardenedMainGetTrustedMain: dlopen("/usr/lib/virtualbox/VirtualBox.so",) ...

  10. Squid代理服务器(四)——反向代理

    一.概念 反向代理主要实现的是我们内部网站的加速功能 ,许多大型的门户网站架构中都采用了反向代理加速,使用比较多的是nginx.squid等,通过squid反向代理加速网站的访问速度,可将不同的url ...