说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法。
一、Shell中函数的定义
为了方便程序和管理和模块化并减少代码的重复,函数的确是一个好东西。而Shell中函数的定义有两种方法,如下:
function fname()
{
statements;
}
或
fname()
{
statements;
}
注意,()内是没有参数的,它并不像C语言那样,在()里可以有参数。
那大家可能就郁闷了,函数调用或多或少总是会需要一些参数,那么这些参数要怎么传递进来呢?其实参数传递方式为:fname;(不需要传递参数)或fname agr1 arg2(需要传递两个参数);
二、自定义函数的例子
不知道大家的情况如何,反正一开始我就觉得很别扭,因为在C语言中,例如我定义一个函数int cmp(int a, int b),那么我就会在函数中使用到函数头中声明的变量a和b,而在Shell中却没有定义参数,那我的函数又需要用到这两个参数,怎么办好呢?下面就用一个例子来说明好了。
#! /bin/bash
# Filename:LoopPrint.sh
function LoopPrint()
{
count=0;
while [ $count -lt $1 ];
do
echo $count;
let ++count;
sleep 1;
done
return 0;
}
read -p "Please input the times of print you want: " n;
LoopPrint $n;
先来说说这个程序的功能吧,就是输入一个数字n,然后从0开始每隔1秒输入一个数字,直到输出n-1为止。首先,程序会要求你输入一个数学,然后调用函数来进行输出的功能。
注意注释1的那一句,里面有一个变量$1,大家应该还记得调用函数时参数的传递方式,即fname agr1 arg2,这里的$1就是表示第一个参数,依此类推,$2就是第二个参数,$3就是第3个参数,$n就是表示第n个参数。
所以$1就是变量n的值。这样说大家懂了吧!
补充一下,就是:
$0:是脚本本身的名字;
$#:是传给脚本的参数个数;
$@:是传给脚本的所有参数的列表,即被扩展为"$1" "$2" "$3"等;
$*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成"$1c$2c$3",其中c是IFS的第一个字符;
$$:是脚本运行的当前进程ID号;
$?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误;
特别注意,传递参数时,(这个例子中)一定要写成LoopPrint $n;而不能写成LoopPrint n。为什么?例如你输入的是20,则n的值($n)为20,前者表示的是把n的值,即20传递给函数LoopPrint,而后者则表示把字符n传递给函数LoopPrint。这点与在静态语言中的函数参数传递是很不同的,因为在Shell中变量的使用并不需要先定义,所以要使用变量,让Shell知道它是一个变量,并要传递它的值时,就是用$n,而不能直接用n,否则只把n当作一个字符来处理,而不是一个变量。
三、作用域问题
函数的作用域与C/C++语言中的作用约束是一样的,函数的定义一定要出现在函数的调用语句之前,但是有一点跟C/C++中不一样的就是变量的作用域问题,经过本人的试验,在注释1的语句改为while [ $count -lt $n ];也是可行的,即函数可以使用本文件中出现的任何变量,但是本人还是建议使用上面例子中的方法,即while [ $count -lt $1 ],并且不要随意使用函数中的变量之外的变量,因为你并不一定知道你调用函数时函数外有什么变量存在也不知道它的值是什么,也不能保证别人在使用你的函数时会传递你在函数中使用到的变量名,如这里的n,别人在使用时可能传递的就是他自己定义的变量,如Count等。
转载于:https://my.oschina.net/alfredliukai/blog/496536
分享到:
相关推荐
Linux 在Shell脚本中使用函数实例详解 Shell的函数 Shell程序也支持函数。函数能完成一特定的功能,可以重复调用这个函数。 函数格式如下: 函数名() { 函数体 } 函数调用方式: 函数名 参数列表 实例:编写...
这一过程涉及到动态链接库(DLL)的加载、函数地址获取以及函数调用等技术。下面将详细阐述这些知识点。 首先,`load_so`通常指的是加载共享对象(Shared Object),在Linux系统中,动态链接库文件的扩展名为`.so`...
Linux Shell是Linux操作系统中不可或缺的一部分,它是一种命令行接口,允许用户通过文本命令与系统进行交互。Shell脚本则是编写的一系列命令,可以自动化执行一系列任务,极大地提高了工作效率。在这个"Linux Shell...
Linux Shell 编程基础是 Linux 操作系统中一个非常重要的组件,它提供了一个交互式命令行界面,允许用户输入命令来执行各种操作。在 Linux 系统中,Shell 是一个命令解释器,它可以解释用户输入的命令,并将其翻译...
在IT行业中,Linux Shell编程是系统管理员和开发者必备的技能之一。它允许用户通过命令行接口与操作系统进行交互,执行自动化任务,大大提高工作效率。本文将深入探讨Linux Shell编写的基础知识,包括基本概念、常用...
《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...
通过熟练掌握这些Shell函数式编程技巧,你将能够编写出更加高效、可维护的脚本,从而提升Linux系统的自动化和管理效率。记住,实践是检验真理的唯一标准,多动手编写和调试Shell脚本,才能真正领会其精髓。
在Linux系统中,Shell脚本是用户与操作系统交互的重要方式,而Shell函数是编写复杂脚本时不可或缺的构造块。本文将深入探讨如何在Shell中定义、调用和使用函数,以及函数参数的传递和跨文件调用。 一、无参函数的...
- **定义和调用Shell函数**:通过`function`关键字或直接使用函数名定义,通过函数名调用。 - **函数参数**:函数可以接收参数,类似于位置参数。 6. **输入/输出重定向** - **标准输入(stdin)、标准输出...
在Linux操作系统中,Shell是一种命令行解释器,它允许用户通过文本输入来执行系统命令。C语言实现Linux Shell的功能是一项有趣的编程挑战,可以深入理解操作系统的工作原理。本项目旨在用C语言实现一些基本的Shell...
5. **函数**:如何定义和调用Shell函数,提高代码复用性。 6. **参数处理**:脚本接收命令行参数的方式,以及特殊变量$0、$1、$*、$@等的含义和用法。 7. **Shell内置命令**:如source(使脚本立即执行,不创建新...
这个"Linux-test-shell.zip"文件显然是一份用于练习编写和调用Linux Shell脚本的资源。下面我们将深入探讨Linux Shell脚本的基本概念、常用命令以及如何在实际环境中调用它们。 首先,让我们理解什么是Shell。在...
Linux中的Shell是一个至关重要的组成部分,它是用户与操作系统交互的接口,扮演着命令解释器的角色。在Linux系统中,默认的Shell通常是Bash(Bourne-Again SHell),它继承了Bourne shell的功能并增加了许多扩展特性...
Linux Shell编程是Linux系统管理与自动化任务的核心技术之一,它主要指的是使用Shell脚本来执行一系列命令,实现自动化操作。在Linux环境中,Bash(Bourne-Again SHell)是最常用的Shell,也是许多Linux发行版的默认...
在Linux中,有多种类型的shell,如ash、bash、ksh、csh、tcsh等。其中,bash(Bourne-Again SHell)是最常用的一种,也是大多数Linux发行版的默认shell。 bash具有许多特性,例如: 1. **命令历史**:bash支持通过...
但根据文件信息中的标题和描述,可以推断出本书内容涉及Linux Shell编程的基础知识和技能提升。下面将基于Linux Shell编程这一主题,详细说明相关知识点。 Linux Shell编程是学习Linux系统管理和自动化脚本的重要...
Bash(Bourne Again SHell)是Linux系统中最普遍使用的Shell,本书应该也会重点介绍bash Shell脚本的编写技巧。 Shell脚本的基本构成包括:变量、环境变量、命令执行、流程控制(如if语句、for循环、while循环等)...
1. **Shell种类**:Linux中有多种Shell,如Bash(Bourne-Again SHell)、C Shell、Korn Shell等,其中Bash是目前最常用的一种。 2. **Shell环境**:理解Shell的启动过程、环境变量(如PATH、HOME等)以及配置文件...
Linux Shell脚本是Linux操作系统中一种强大的自动化工具,它允许用户通过编写脚本来执行一系列命令,实现系统管理和任务自动化。本书《Linux Shell脚本攻略》(第2版)深入浅出地介绍了Shell脚本的编写技巧和实战...
四、Shell函数 定义和调用自定义函数,方便代码重用和模块化。例如: ``` my_function() { echo "Hello from my function!" } my_function ``` 五、管道与重定向 1. 管道:`|`将一个命令的输出作为另一个命令的...