Shell 语法之函数

函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。每当需要在脚本中使用这样的代码块时,只需引用该代码块被赋予的函数名称。

创建函数

格式

function name {

  commands

}

name 属性定义了该函数的唯一名称。name 后面要有空格。

name() {

  commands

}

示例

#!/bin/bash
# using a function in a script

function func1 {
echo "This is an example of a function"
}

count=1
while [ $count -le 5 ]
do
func1
count=$[ $count + 1 ]
done
echo "This is the end of the loop"
func1
echo "Now this is the end of the script"

注意:如果在函数定义之前使用函数,会得到错误消息。

如果重新定义函数,那么新定义将取代函数原先的定义。

函数返回值

默认退出状态

默认情况下,函数的退出状态是函数的最后一条命令返回的退出状态。

示例

#!/bin/bash
# testing the exit status of a function

func1() {
echo "trying to display a non-existent file"
ls -l badfile
}

echo "testing the function:"
func1
echo "The exit status is: $?"

使用 return 命令

return  命令可以使用单个整数值来定义函数退出状态,提供了一种通过编程设置函数退出状态的简单方法。

示例

#!/bin/bash
# using the return command in a function

function db1 {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2]
}

db1
echo "The new value is $?"

注意:请记住在函数完成后尽快提取返回值

请记住退出状态的取值范围是0~255

使用函数输出

正如命令输出可以捕获并存放到 shell 变量中一样,函数的输出也可以捕获并存放到 shell 变量中。

示例

#!/bin/bash
# using the echo to return a value

function db1 {
read -p "Enter a value: " value
echo $[ ($value) * 2 ]
}

result=`db1`
echo "The new value is $result"

向函数传递参数

函数可以使用标准参数环境变量来表示命令行传递给函数的参数。

函数名在变量 $0 中定义, 函数命令行的其他参数使用变量 $1、$2...,专有变量$#可以用来确定传递给函数的参数数目。

示例

#!/bin/bash
# passing parameters to a function

function addem {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}

echo -n "Adding 10 and 15: "
value=`addem 10 15`
echo $value
echo -n "Let‘s try adding just one number: "
value=`addem 10`
echo $value
echo -n "Now trying adding no numbers: "
value=`addem`
echo $value
echo -n "Finally, try adding three numbers: "
value=`addem 10 15 20`
echo $value

由于函数为自己的参数值使用专用的参数环境变量,所以函数无法从脚本命令行直接访问脚本参数值。如果想在函数中使用这些值,那么必须在调用该函数时手动传递这些数据。

示例

#!/bin/bash
# trying to access script parameters inside a function

function func7 {
echo $[ $1 * $2 ]
}

if [ $# -eq 2 ]
then
value=`func7 $1 $2`
echo "The result is $value"
else
echo "Usage: badtest1 a b"
fi

在函数中使用变量

全局变量是在 shell 脚本内处处有效的变量。

示例

#!/bin/bash
# using a global variable to pass a value

function db1 {
value=$[ $value * 2 ]
}

read -p "Enter a value: " value
db1
echo "The new value is: $value"

局部变量是在函数内部使用的变量,在变量声明前面冠以 local 关键字。

如果脚本在函数外部有同名变量,那么 shell 将能区分开这两个变量。

示例

#!/bin/bash
# demonstrating the local keyword

function func1 {
local temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}

temp=4
value=6

func1
echo "The result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi

向函数传递数组

如果试图将数组变量作为函数参数使用,那么函数只提取数组变量的第一个取值。

示例

#!/bin/sh
# array variable to function test

function testit {
local newarray
newarray=("[email protected]")
echo "The new array value is: ${newarray[*]}"
}

myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}

必须将数组变量拆分为单个元素,然后使用这些元素的值作为函数参数。

函数内部使用数组

示例

#!/bin/bash
# adding values in an array

function addarray {
local sum=0
local newarray
newarray=(`echo "[email protected]"`)
for value in ${newarray[*]}
do
sum=$[ $sum + $value ]
done
echo $sum
}

myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=`addarray $arg1`
echo "The result is $result"

从函数返回数组

示例

#!/bin/sh
# returning an array value

function arraydblr {
local origarray
local newarray
local elements
local i
origarray=(`echo "[email protected]"`)
newarray=(`echo "[email protected]"`)
elements=$[ $# - 1 ]
for(( i=0; i<=elements; i++ ))
{
newarray[$i]=$[ ${origarray[$i]} * 2 ]
}
echo ${newarray[*]}
}

myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=(`arraydblr $arg1`)
echo "The new array is: ${result[*]}"

函数递归

示例

#!/bin/sh
# using recursion

function factorial {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=`factorial $temp`
echo $[ $1 * $result ]
fi
}

read -p "Enter value: " value
result=`factorial $value`
echo "The factorial of $value is: $result"

创建库

创建函数的库文件,可以在不同脚本中引用该库文件。

其难点在于 shell 函数的作用域。与环境变量一样,shell 函数仅在其定义所处的 shell 会话中有效。如果从 shell 命令行界面运行库文件,那么 shell 将打开一个新的 shell ,并在新 shell 中运行此脚本,但是当试图运行调用这些库函数的另一个脚本时,库函数并不能使用。

使用函数库的关键是 source 命令。source 命令在当前 shell 环境中执行命令,而非创建新 shell 来执行命令。使用 source 命令在 shell 脚本内部运行库文件脚本。

source 有一个短小的别名,称为点操作符(.)

示例

#!/bin/bash
# using functions defiend in a library file

. ./myfuncs

value1=10
value2=5
result1=`addem $value1 $value2`
result2=`multem $value1 $value2`
result3=`divem $value1 $value2`

echo "The result of adding them is: $result1"
echo "The result of multiplying them is: $result2"
echo "The result of dividing them is: $result3"

在命令行中使用参数

$ function divem { echo $[ $1 + $2 ]; }

$ divem 100 5

在.bashrc 文件中定义函数

将函数定义放在 shell 每次启动都能重新载入的地方,.bashrc。

可以直接定义函数,或者提供函数文件。

时间: 2024-08-05 01:55:54

Shell 语法之函数的相关文章

Shell 语法 if 、 case 、for 、 while、 until 、select 、repeat、子函数

if语法 : if [ expression ]    then   commandselif [ expression2 ]   then   commandselse   commandsfi case 语法: case string1 in   str1)    commands;;   str2)    commands;;   *)    commans;;esac 循环语句 for 语法:    for  var in list do commands done     在此形式时,

Linux中的shell脚本编程——函数

概述: 本章节将总结while,for循环语句的特殊用法,在不同的场景当中,更能发挥其功能和价值.除此之外,还会介绍一种特殊的循环语句select语句,实现菜单的作用.最重要的是讲解shell脚本编程中函数的用法.这些内容都要熟练掌握. 一.循环语句的特殊用法: 1.while循环的特殊用法(遍历文件的每一行): □语法:while read line; do 循环体 done < /PATH/FROM/SOMEFILE □意义:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将

shell语法简单介绍

一.基本的语法 1.1.shell文件开头 shell文件必须以以下的行開始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的參数是用来运行该文件的程序.在这个样例中我们使用/bin/sh来运行程序. 当编辑好脚本时,假设要运行该脚本,还必须使其可运行. 要使脚本可运行: 执行chmod +x filename 这样才干用./filename 来执行 1.2 凝视 在进行shell编程时,以#开头的句子表示凝视,直到这一行的结束.我们真诚地建议您在程序中使用凝视. 假设

shell语法简介

一.基本语法 1.1.shell文件开头 shell文件必须以下面的行开始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序.  当编辑好脚本时,如果要执行该脚本,还必须使其可执行.  要使脚本可执行: 运行chmod +x filename 这样才能用./filename 来运行 1.2 注释  在进行shell编程时,以#开头的句子表示注释,直到这一行的结束.我们真诚地建议您在程序中使用注释

shell语法习题练习进阶版

第4章 shell语法深度习题练习 4.1 使用if,case,函数的方法将服务改成system(centos6) 4.1.1 if方法 4.1.1.1 system实现 4.1.1.1.1 编写代码信息 [[email protected] run]# vim /server/scripts/rsyncd ? ? para=$1 proc_file="/var/run/rsyncd.pid" ? if [ "x$para" == "xstart"

shell脚本的函数介绍和使用案例

#前言:今天我们来聊聊shell脚本中的函数知识,看一下函数的优势,执行过程和相关的使用案例,我们也来看一下shell和python的函数书写方式有什么不同 #简介 1.函数也具有别名类似的功能 2.函数是把程序里多次调用相同的代码部分定义成一份,然后给这份代码定义个名字,如果出现重复的就调用就行了 #函数的优势 1.把相同的程序段定义成函数,可以减少整个程序的代码量 2.可以让程序代码结构更清晰 3.增加程序的可读.易读性.以及管理性 4.可以实现程序功能模块化,不同的程序使用函数模块化 #语

shell实现trim函数-去除字符串两侧的空格(包括tab,space键)

shell实现trim函数效果去除字符串两侧的空格,以下三个命令等价,都能实现 sed 's/^\s*//' totrim.txt |sed 's/\s*$//'>trimed.txtsed 's/^\s*//;s/\s*$//' totrim.txt>trimed.txtsed -e 's/^\s*//' -e 's/\s*$//' totrim.txt>trimed.txt 主要就是利用正则表达式,^\s*表示字符串前面的零个或多个空格,\s*$表示字符串后面的零个或多个空格.

Shell编程关于函数要注意的几点

今天上午一个朋友突然QQ问到,shell编程中的函数为什么return只能是整数,怎么样才能将函数的执行结果返回并保存至某个变量中.其实这个问题很好解决---只需要认真了解下shell函数即可. shell编程中关于函数需要知道的几点 一.无论是在函数内,还是在函数外,$0的值都是该脚本本身.     [[email protected] ~]# cat test.sh     #!/bin/bash          echo $0          function testFunc(){

makefile中的shell语法

在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是shell代码.eg:xx = xx1         // 这里时makefile代码yy:xx = xx2   // 这是是makefile代码,makefile允许变量赋值时,'='号两边留空格yy:    xx=xx3 // 只有这里是shell代码 ,shell不允许‘=’号两边有空格哦.