一、Shell脚本中的函数

和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表。例如:

#! /bin/sh

fun(){ echo "Function fun is called";}
echo "-=start=-"
fun
echo "-=end=-"

注意函数体的左花括号'{'和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号'}'写在同一行,命令末尾必须有;号。

在定义fun()函数时并不执行函数体中的命令,就像定义变量一样,只是给fun这个名字一个定义,到后面调用fun函数的时候(注意Shell中的函数调用不写括号)才执行函数体中的命令。Shell脚本中的函数必须先定义后调用,一般把函数定义都写在脚本的前面,把函数调用和其它命令写在脚本的最后(类似C语言中的main函数,这才是整个脚本实际开始执行命令的地方)。

Shell函数没有参数列表并不表示不能传参数,事实上,函数就像是迷你脚本,调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的$0、$1、$2等变量。函数中可以用return命令返回,如果return后面跟一个数字则表示函数的Exit Status。

下面这个脚本可以一次创建多个目录,各目录名通过命令行参数传入,脚本逐个测试各目录是否存在,如果目录不存在,首先打印信息然后试着创建该目录。

编辑脚本
[root@VM_0_5_centos test]# vi tfun.sh
查看脚本内容
[root@VM_0_5_centos test]# cat tfun.sh
#! /bin/sh is_directory()
{
DIR_NAME=$1
if [ ! -d $DIR_NAME ]; then
return 1
else
return 0
fi
} for DIR in "$@"; do
if is_directory "$DIR"
then :
else
echo "Directory $DIR doesn't exist. Creating it now..."
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Can't create directory $DIR"
exit 1
fi
fi
done
运行测试脚本
[root@VM_0_5_centos test]# sh tfun.sh aaa abb acc add
Directory aaa doesn't exist. Creating it now...
Directory abb doesn't exist. Creating it now...
Directory acc doesn't exist. Creating it now...
Directory add doesn't exist. Creating it now...
查看是否成功创建目录
[root@VM_0_5_centos test]# ll
total 20
drwxr-xr-x 2 root root 4096 Jul 16 11:16 aaa
drwxr-xr-x 2 root root 4096 Jul 16 11:16 abb
drwxr-xr-x 2 root root 4096 Jul 16 11:16 acc
drwxr-xr-x 2 root root 4096 Jul 16 11:16 add
-rw-r--r-- 1 root root 340 Jul 16 11:15 tfun.sh

注意:is_directory()返回0表示真返回1表示假。mkdir $DIR > /dev/null 2>&1这条语句时因为直接使用mkdir $DIR或mkdir $DIR > /dev/null可能会出错,所以将可能出错的情况都重定向输出到/dev/null这个黑洞目录当中。

二、Shell脚本的调试方法

Shell提供了一些用于调试脚本的选项,如下所示:

-n

读一遍脚本中的命令但不执行,用于检查脚本中的语法错误

-v

一边执行脚本,一边将执行过的脚本命令打印到标准错误输出

-x

提供跟踪执行信息,将执行的每一条命令和结果依次打印出来

使用这些选项有三种方法,一是在命令行提供参数

[root@VM_0_5_centos test]# sh -x tfun.sh a1 a2 a3
 [root@VM_0_5_centos test]# sh -x tfun.sh a1 a2 a3
+ for DIR in '"$@"'
+ is_directory a1
+ DIR_NAME=a1
+ '[' '!' -d a1 ']'
+ return 1
+ set -x
+ echo 'Directory a1 doesn'\''t exist. Creating it now...'
Directory a1 doesn't exist. Creating it now...
+ mkdir a1
+ '[' 0 -ne 0 ']'
+ set +x
+ echo 'Directory a2 doesn'\''t exist. Creating it now...'
Directory a2 doesn't exist. Creating it now...
+ mkdir a2
+ '[' 0 -ne 0 ']'
+ set +x
+ echo 'Directory a3 doesn'\''t exist. Creating it now...'
Directory a3 doesn't exist. Creating it now...
+ mkdir a3
+ '[' 0 -ne 0 ']'
+ set +x

第一种方法测试结果:

二是在脚本开头提供参数

#! /bin/sh -x

第三种方法是在脚本中用set命令启用或禁用参数

for DIR in "$@"; do
if is_directory "$DIR"
then :
else
set -x
echo "Directory $DIR doesn't exist. Creating it now..."
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Can't create directory $DIR"
exit 1
fi
set +x
fi
done
 [root@VM_0_5_centos test]# sh tfun.sh b bb bbb
+ echo 'Directory b doesn'\''t exist. Creating it now...'
Directory b doesn't exist. Creating it now...
+ mkdir b
+ '[' 0 -ne 0 ']'
+ set +x
+ echo 'Directory bb doesn'\''t exist. Creating it now...'
Directory bb doesn't exist. Creating it now...
+ mkdir bb
+ '[' 0 -ne 0 ']'
+ set +x
+ echo 'Directory bbb doesn'\''t exist. Creating it now...'
Directory bbb doesn't exist. Creating it now...
+ mkdir bbb
+ '[' 0 -ne 0 ']'
+ set +x

第三种方法测试结果:

set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试。

shell编程基础(四): shell脚本语法之函数及调试的更多相关文章

  1. shell编程基础(二): shell脚本语法之分支语句和循环语句

    一.分支语句 1.条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与 ...

  2. Shell编程(五)脚本语法

    ${}: 数据“内容”删除,替换:{}: 列表 1. 条件测试: test =~:正则匹配 2. if/then/elif/else/fi #!/bin/bash echo "Is it o ...

  3. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  4. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  5. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  6. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  7. 6-2 shell编程基础

    shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...

  8. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  9. shell编程系列26--大型脚本工具开发实战

    shell编程系列26--大型脚本工具开发实战 大型脚本工具开发实战 拆分脚本功能,抽象函数 .function get_all_group 返回进程组列表字符串 .function get_all_ ...

随机推荐

  1. mvc 路由伪静态实现

    很多网站都采用伪静态,例如以html.shtml等结尾的url,mvc的路由可以轻松实现. 配置路由 默认路由配置 添加伪静态路由 mvc的路由原理是从上往下匹配的,所以只需要在后面添加自己配置的路由 ...

  2. How to setup Visual Studio without pain

    Visual Studio (VS) can be very hard to install. If you are lucky, one whole day may be enough to ins ...

  3. STM32CubeMX+Keil裸机代码风格(1)

    1.打开STM32CubeMX,New project 选好自己要用的芯片 2.选上左侧SYS中的debug Serial Wire(定义烧程序的端口) . 3,选上左侧TIM6,使TIM6可用(TI ...

  4. 《Pyhton语言程序设计》_第7章_对象和类

    #7.2.1_定义类 一个类的功能:数据域.定义方法.初始化程序 初始化程序总是被命名为:_ _init_ _ (两个连续的下划线) #7.2.4_self参数 #self参数是指向对象本身的参数,那 ...

  5. UltraISO制作CentOS 7.6 U盘引导安装盘

    一.制作准备: 1.UltraISO下载安装 2.CentOS镜像文件下载(阿里镜像下载) 二.制作引导盘: 1.电脑插入U盘 2.UltraISO加载镜像文件: 文件->打开->选择对应 ...

  6. Azure VMs

    Azure VMs provide a way to move your on-premises SQL Server workloads and applications to the Cloud. ...

  7. [转] KVM scalability and consolidation ratio: cache none vs cache writeback

    http://www.ilsistemista.net/index.php/virtualization/43-kvm-scalability-and-consolidation-ratio-cach ...

  8. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言   老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...

  9. 吴恩达机器学习笔记16-决策边界(decision boundary)

    现在讲下决策边界(decision boundary)的概念.这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么. 在逻辑回归中,我们预测:当ℎ

  10. 字体图标三种格式区别(Unicode / Font class / Symbol)

    在实际项目中,或多或少会用到字体图标,优点是即减少了体积,又减少了http请求,可谓一举两得 我一般是在阿里巴巴矢量图库下载字体图标:http://www.iconfont.cn/   下面以阿里巴巴 ...