bash shell 提供了用户自定义函数功能,可以将 shell 脚本代码放入函数中封装起来。
函数是一个脚本代码块,你可以为其命名并在脚本中的任何位置重用它。每当需要在脚本中使用该代码块时,直接写函数名即可(这叫作调用函数)。
在 bash shell 脚本中创建函数的语法有两种:
function name {
commands
}
name() {
commands
}
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"
bash shell 把函数视为一个小型脚本,运行结束时会返回一个退出状态码。有 3 种方法能为函数生成退出状态码:
在默认情况下,函数的退出状态码是函数中最后一个命令返回的退出状态码。函数执行结束后,可以使用标准变量$?来确定函数的退出状态码。
function dbl {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
dbl
echo "The new value is $?"
result=$(dbl)
function dbl {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=$(dbl)
echo "The new value is $result"
func1 $value1 10
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 try adding no numbers: "
value=$(addem)
echo $value
echo -n "Finally, try adding three numbers: "
value=$(addem 10 15 20)
echo $value
function badfunc1 {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then
value=$(badfunc1)
echo "The result is $value"
else
echo "Usage: badtest1 a b"
fi
$
$ ./badtest1
Usage: badtest1 a b
$ ./badtest1 10 15
./badtest1: * : syntax error: operand expected (error token is "*
")
The result is
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
local temp
local temp=$[ $value + 5 ]
function testit {
echo "The parameters are: $@"
thisarray=$1
echo "The received array is ${thisarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
testit $myarray
$
$ ./badtest3
The original array is: 1 2 3 4 5
The parameters are: 1
The received array is 1
function testit {
local newarray
newarray=(`echo "$@"`)
echo "The new array value is ${newarray[*]}"
local sum=0
for value in ${newarray[*]}
do
sum=$[ $sum + $value ]
done
echo $sum
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
testit ${myarray[*]}
function arraydblr {
local origarray
local newarray
local elements
local i
origarray=($(echo "$@"))
newarray=($(echo "$@"))
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[*]}"
function factorial {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=$(factorial $temp)
echo $[ $result * $1 ]
fi
}
read -p "Enter value: " value
result=$(factorial $value)
echo "The factorial of $value is: $result"
$ cat myfuncs
# my script functions
function addem {
echo $[ $1 + $2 ]
}
$
. ./myfuncs
$ cat test14
#!/bin/bash
# using functions defined in a library file
. ./myfuncs
value1=10
value2=5
result1=$(addem $value1 $value2)
echo "The result of adding them is: $result1"
$
$ ./test14
The result of adding them is: 15
$ function divem { echo $[ $1 / $2 ]; }
$ divem 100 5
20
$ function doubleit { read -p "Enter value: " value; echo $[ $value * 2 ]; }
$
$ doubleit
Enter value: 20
40
$ function multem {
> echo $[ $1 * $2 ]
> }
$ multem 2 5
10
可以下载各种 shell 脚本函数并将其用于自己的应用程序中。
shtool 库提供了一些简单的 shell 脚本函数,可用于实现日常的shell 功能,比如处理临时文件和目录、格式化输出显示等。
下载及安装
shtool 软件包的下载地址如下:
ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz
tar -zxvf shtool-2.0.8.tar.gz
cd shtool-2.0.8
接下来就可以构建 shell 脚本库文件了。shtool 文件必须针对特定的 Linux 环境进行配置。配置过程必须使用标准的 configure 命令和 make 命令,这两个命令常用于 C 编程环境。要构建库文件,只需输入如下内容即可:
$ ./configure
$ make
也可以使用 make 命令测试这个库文件:
$ make test
Running test suite:
echo...........ok
mdate..........ok
...
OK: passed: 19/19
要完成安装,可以使用 make 命令的 install 选项。不过需要以 root 用户的身份运行该命令:
# make install
shtool 库提供了大量方便的函数。
| 函数 | 描述 |
|---|---|
| arx | 创建归档文件(包含一些扩展功能) |
| echo | 显示字符串,并提供了一些扩展构件 |
| fixperm | 改变目录树中的文件权限 |
| install | 安装脚本或文件 |
| mdate | 显示文件或目录的修改时间 |
| mkdir | 创建一个或多个目录 |
| mkln | 使用相对路径创建链接 |
| mkshadow | 创建一棵阴影树(shadow tree) |
| move | 带有替换功能的文件移动 |
| path | 处理程序路径 |
| platform | 显示平台标识 |
| prop | 显示一个带有动画效果的进度条 |
| rotate | 轮替(rotate)日志文件 |
| scpp | 共享的 C 预处理器 |
| slo | 根据库的类别, 分离出链接器选项 |
| subst | 使用 sed 的替换操作 |
| table | 以表格的形式显示由字段分隔(field-separated)的数据 |
| tarball | 从文件和目录中创建 tar 文件 |
| version | 创建版本信息文件 |
shtool [options] [function [options] [args]]
可以在命令行或 shell 脚本中直接使用 shtool 函数。下面是一个在 shell 脚本中使用platform 函数的例子:
$ cat test16
#!/bin/bash
shtool platform
$ ./test16
Ubuntu 20.04 (AMD64)
prop 函数使用\、 |、/和-字符创建了一个旋转的进度条,可以告诉 shell 脚本用户目前正在进行一些后台处理工作。要使用 prop 函数,只需将希望监看的输出管接到 shtool 脚本即可:
$ ls –al /usr/bin | shtool prop –p "waiting..."
waiting..