`

bash编程之 函数

 
阅读更多

函数:代码复用 模块编程

语法:

	function f_name {
		函数体
	}

	f_name() {
		函数体
	}

 

 

调用:使用函数名

函数名出现的地方,会被自动替换为函数代码;

 

练习:利用函数改写此前的服务脚本:

	#!/bin/bash
	#
	prog=`basename $0`
	lockfile=/var/lock/subsys/$prog

	start() {
		if [ -e $lockfile ]; then
			echo "$prog is already running."
		else
			touch $lockfile
			[ $? -eq 0 ] && echo "Starting $prog finished."
		fi
	}

	stop() {
		if [ -e $lockfile ]; then
			rm -f $lockfile
			[ $? -eq 0 ] && echo "Stoping $prog finished."
		else
			echo "$prog is stopped yet."
		fi
	}

	case $1 in
	"start")
		start ;;
	"stop")
		stop ;;
	"restart")
		stop
		start ;;
	*)
		echo "Usage: $prog {start|stop|restart}"
		exit 1
	esac        

 

 

函数的返回值:

函数的执行结果返回值:

函数中使用打印语句:echo, printf

函数体中OS命令执行结果的输出

函数的退出状态码:

默认取决于函数体执行的最后一个命令的退出状态码;

自定义退出状态码:

return [0-255]

注意:函数体运行时,一旦遇到return语句,函数即返回;

 

函数可接受参数:

传递参数给函数:调用函数时,在函数名后给出参数列表即可;例如“testfunc arg1 arg2 arg3”

 

在函数体中可使用$1, $2,...来调用传递过来的各参数;

可使用类似脚本的特殊变量:

$*, $@: 一次性获取参数列表:

$#: 参数的个数

#!/bin/bash
#
showuserinfo() {
	[ $# -lt 1 ] && return 1

	! id $1 &> /dev/null && return 2

	grep "^$1\>" /etc/passwd | cut -d: -f7
	[ $? -eq 0 ] && return 0 || return 3
}

while true; do
	read -p "Enter a username: " username
	[ "$username" == 'quit' ] && break
	showuserinfo $username
	[ $? -ne 0 ] && echo "There is something wrong."
done      

 

 

练习:写一个脚本,完成如下功能(使用函数):

1、提示用户输入一个可执行命令;

2、获取这个命令所依赖的所有库文件(使用ldd命令);

3、复制命令至/mnt/sysroot/对应的目录中

解释:假设,如果复制的是cat命令,其可执行程序的路径是/bin/cat,那么就要将/bin/cat复制到/mnt/sysroot/bin/目录中,如果复制的是useradd命令,而useradd的可执行文件路径为/usr/sbin/useradd,那么就要将其复制到/mnt/sysroot/usr/sbin/目录中;

4、复制各库文件至/mnt/sysroot/对应的目录中;

#!/bin/bash
#
target=/mnt/sysroot

[ -d $target ] || mkdir $target

preCmd() {
	if which $1 &> /dev/null; then
		cmdpath=$(which --skip-alias $1)
		return 0
	else
		echo "No such command."
		return 1
	fi
}

cmdCopy() {
	cmddir=$(dirname $cmdpath)
	[ -d $target/$cmddir ] || mkdir -p $target/$cmddir
	[ -f $target/$cmdpath ] || cp $1 $target/$cmddir
	return 0
}

libCopy() {
	for lib in $(ldd $1 | grep -E -o "/[^[space::]]+"); do
		libdir=$(dirname $lib)
		[ -d $target/$libdir ] || mkdir -p $target/$libdir
		[ -f $target/$lib ] || cp $lib $target/$libdir
	done
	return 0
}

main() {
	while true; do
		read -p "Plz enter a command(quit): " cmd
		[ "$cmd" == 'quit' ] && break
		preCmd $cmd
		if [ $? -eq 0 ]; then
			cmdCopy $cmdpath
			libCopy $cmdpath
		fi
	done
}

main

 

 

函数递归:

函数直接或间接调用函数自身;

1 1 2 3 5 8 13

阶乘:10!

n(n-1)!

n(n-1)(n-2)!

 

阶乘函数:

	fact() {
		if [ $1 -eq 0 -o $1 -eq 1 ]; then
			echo 1
		else
		   echo $[$1*$(fact $[$1-1])]
		fi
	}

 

 

分享到:
评论

相关推荐

    bash高级编程 advanced bash script

    **Bash高级编程详解** Bash(Bourne-Again SHell)是Unix/Linux系统中最常用的命令行解释器,也是脚本编程的强大工具。对于任何想要深入理解和掌握Linux系统操作或者自动化任务处理的IT专业人士来说,学习Bash高级...

    高级Bash脚本编程指南 操作系统 - Linux - 高级Bash脚本编程指南.zip

    对于系统管理员和开发者来说,掌握高级Bash脚本编程技巧是提高工作效率的关键。这份“高级Bash脚本编程指南”涵盖了从基础到进阶的各个层面,旨在帮助用户深入理解和熟练运用Bash脚本。 首先,让我们了解一下Bash的...

    Linux Bash脚本编程大全_超清版

    Linux Bash脚本编程是Linux系统管理与自动化任务执行的核心技能之一。Bash,全称Bourne-Again SHell,是Unix及Linux操作系统中最常用的命令行解释器,它提供了丰富的命令行工具和强大的脚本编写能力。这本书《Linux ...

    bash高级编程教程

    书中后续章节将深入到变量、函数、数组、流程控制、错误处理、输入/输出重定向、子shell、程序调用、正则表达式、脚本调试等多个方面,全面覆盖了Bash脚本编程的各个方面。每个主题都配有丰富的示例和实用的技巧,...

    linux开发之bash编程

    在Linux开发中,Bash编程是一个基础但非常重要的技能。Shell脚本广泛应用于系统管理、安装、任务调度、网络管理等方面。由于Shell脚本能够将常用的命令序列整合到一个文件中,用户只需运行一个脚本文件即可完成一...

    ch8 Bash编程1

    【Bash编程1】概述 Bash编程,也被称为Shell脚本编程,是Linux和Unix系统中常用的一种自动化任务执行方式。它利用Bourne-Again SHell (Bash) —— Linux默认的Shell,来编写一系列可执行的命令,形成一个可执行文件...

    高级Bash脚本编程指南 源码

    《高级Bash脚本编程指南》是一本深入探讨Bash编程的资源,提供了丰富的示例和详尽的解释。以下是根据提供的压缩包文件名所涉及的一些核心知识点: 1. **数组操作**: - `array-append.bash`:Bash从4.0版本开始...

    高级Bash编程

    ### 高级Bash编程知识点概述 #### 一、引言 本教程旨在为初学者提供一条通往高级Bash编程的道路。它不仅适用于自学,也是课堂教学的理想材料,尤其是在教授编程概念方面。通过丰富的实例和练习,读者将逐步掌握...

    abs和bash编程

    首先,我们来了解Bash编程的基础。Bash脚本通常以`#!/bin/bash`作为开头,声明使用Bash解释器执行该文件。脚本中的每一行都是一个命令,可以是内置命令、shell函数、外部程序,或者通过分号或换行符隔开的多个命令。...

    《高级bash编程指南》

    《高级Bash编程指南》还讨论了高级特性,如进程子系统、异步执行(使用`&`符号)、信号处理、函数式编程概念,以及如何编写交互式的shell程序。这些高级话题对于开发复杂的系统级脚本和工具是必不可少的。 总的来说...

    高级bash编程指南_PDF版.zip

    **高级Bash编程指南**是针对Linux或Unix系统中Bash shell脚本编写的一份深入教程,这份PDF版教程旨在帮助用户充分利用Bash的强大功能,提高自动化任务处理和系统管理的效率。Bash(Bourne-Again SHell)是大多数...

    高级bash编程指南中文版

    **高级Bash编程指南中文版**是一本深入探讨Bash shell脚本编程的资源,源自英文版的**Advanced Bash Programming Guide**。Bash是Linux和类Unix系统中最常用的命令行解释器,也是编写自动化任务和脚本的强大工具。这...

    linux高级bash编程(abs)

    **Linux高级Bash编程(ABS)** Bash(Bourne-Again SHell)是Linux系统中最常用的命令行解释器,也是系统脚本编写的重要工具。深入理解和掌握Bash编程,能够极大地提升Linux系统的使用效率和自动化处理能力。在本文...

    高级Bash编程指南 - Advanced Bash-Scripting Guide

    《高级Bash编程指南》是一本深入探讨Shell脚本编程艺术的专业书籍,由Mendel Cooper撰写,旨在帮助读者从初学者进阶为Bash编程的高手。这本书以丰富的实例和详尽的解释,覆盖了Bash编程的各个方面,不仅适合初学者,...

    bash编程实例

    ### bash编程实例:基础知识与应用场景 #### 一、Shell与Bash简介 Shell是一种命令解释器,也是操作系统内核与用户之间的桥梁。它不仅能够解释并执行用户输入的命令,而且还是一种强大的编程语言。通过创建一系列...

    bash-lambda, bash的匿名函数和FP内容.zip

    bash-lambda, bash的匿名函数和FP内容 Bash注意:由于性能原因,由于切换到 zsh,我不再积极维护这个项目。 我可以能会编写类似于wince的类似的内容,但是很希望自动散列支持更快。对 bash ( 一个功能完备的黑客)的...

    2009年图书:精通Bash编程

    **精通Bash编程** Bash(Bourne-Again SHell)是Unix和类Unix操作系统中最常用的一种命令行解释器,也是Linux系统默认的shell。它由GNU项目开发,是自由软件,广泛应用于各种Linux发行版及macOS。这本书《精通Bash...

    高级Bash脚本编程指南[1].3.9.1 (杨春敏 黄毅 译)【无重复页】.pdf

    本书《高级Bash脚本编程指南》是一本深入探讨UNIX®/Linux环境下Bash Shell脚本编程的权威指南,由Mendel Cooper所著。全书内容覆盖广泛,旨在为读者提供从基础到高级的Shell编程技能,并假定读者没有任何脚本编程或...

Global site tag (gtag.js) - Google Analytics