函数定义后可以直接当命令调用

[root@docker-host sh]# test()
> {
> echo "test function"
> }
[root@docker-host sh]# test
test function
[root@docker-host sh]#

定义后可以在终端内使用、但不能在脚本里面使用。可以用tab进行命令提醒

图

[root@docker-host sh]# ps -ef |grep nginx |grep -v grep |wc -l
2
[root@docker-host sh]#

vim nginx_func.sh

#!/usr/bin/env bash


nginx_process_num=$( ps -ef |grep nginx |grep -v grep |wc -l)
echo $nginx_process_num

[root@docker-host sh]# sh nginx_func.sh
4
[root@docker-host sh]#

图

因为脚本名称包含了nginx、处理方式改脚本名称

[root@docker-host sh]# mv nginx_func.sh func.sh
[root@docker-host sh]# sh func.sh
2
[root@docker-host sh]#

mv nginx_func.sh
#!/usr/bin/env bash

echo $$

ps -ef |grep nginx |grep -v grep

echo $?

$?是最后运行的命令的结束代码(返回值)

图

用$$获取进程id并且进行过滤

#!/usr/bin/env bash

this_pid=$$

num1=$(ps -ef |grep nginx |grep -v grep | grep -v ${this_pid} | wc -l)

if [ ${num1} -eq 0 ];then
    systemctl start openresty
    echo "启动成功"
else
    echo "nginx已经启动、进程个数${num1}"
fi

图

函数的传参调用

[vagrant@docker-host ~]$ function hello()
> {
> echo "hello  $1"
> }
[vagrant@docker-host ~]$ hello qidong
hello  qidong
[vagrant@docker-host ~]$ hello
hello
[vagrant@docker-host ~]$

脚本函数传参调用

#!/usr/bin/env bash


function calcu
{
    case $2 in
        +)
            echo "`expr $1 + $3`"
            ;;
        -)
            echo "`expr $1 - $3`"
            ;;
        \*)
            echo "`expr $1 \* $3`"
            ;;
        /)
            echo "`expr $1 / $3`"
            ;;
        esac
}

calcu $1 $2 $3
[vagrant@docker-host sh]$ sh func.sh  40 / 20
2
[vagrant@docker-host sh]$

使用return返回值

使用return返回值,只能返回1-255的整数、函数使用return返回值,通常只是用来供其他地方调用获取状态的,因此通常仅返回0或1;0标识成功,1表示失败

#!/usr/bin/env bash

this_pid=$$

##函数返回值为0是成功的 、这点和php或者其他语言比较奇怪
function is_nginx_running
{
    ps -ef |grep nginx |grep -v grep | grep -v ${this_pid} &>/dev/null
    if [ $? -eq 0 ];then
        return
    else
        return 1
    fi
}

is_nginx_running && echo "Nginx is running" || echo "Nginx is stoped"
[root@docker-host labs]# cd sh/
[root@docker-host sh]# sh nginx_func.sh
Nginx is running
[root@docker-host sh]# systemctl stop openresty
[root@docker-host sh]# sh nginx_func.sh
Nginx is stoped
[root@docker-host sh]#

使用echo可以返回任何字符串

使用echo可以返回任何字符串结果、通常用于返回数据,比如一个字符串或者列表值

#!/usr/bin/env bash


function get_users
{
    users=`cat /etc/passwd | cut -d: -f1`
    echo "$users"
}
#命令替换 执行了get_user函数给了user_list变量
user_list=`get_users`

for u in ${user_list}
do
    echo ${u}
done

函数内部的变量问题

定义变量时,使用local关键字,是局部变量。函数内核外若存在同名变量,则函数内部变量覆盖外部变量

#!/usr/bin/env bash

var1="hello world"

function test
{
    var2=87
}

echo $var1
echo $var2

test
#调用后 var2 编程了全局变量、如果是javascript和php语言声明周期结束后就调用不了
echo $var1
echo $var2
function test1
{
    echo $var2
}

test1

图

用local关键字定义局部变量

#!/usr/bin/env bash

var1="hello world"

function test
{
   local var2=87
}
test
echo $var1
echo $var2

图

定义函数库通过.引入文件

定义base_func.sh

#!/usr/bin/env bash

function add
{
    echo "`expr $1 + $2`"
}

function reduce
{
    echo "`expr $1 - $2`"
}

function multiple
{
    echo "`expr $1 \* $2`"
}

function divide
{
    echo "`expr $1 / $2`"
}

编写test.sh

#!/usr/bin/env bash

. /home/vagrant/labs/sh/base_func.sh

echo "`add 12 23`"
[root@docker-host sh]# sh test.sh
35
[root@docker-host sh]#

通常函数库文件的后缀会命名.lib、库文件通常没有可执行选项

Last modification:February 1, 2020
如果觉得我的文章对你有用,请随意赞赏