函数定义后可以直接当命令调用
[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、库文件通常没有可执行选项