shell之function

本文介绍了如何在Linux Shell中定义和调用函数,如create_dir和remove_dir,以及如何通过case结构进行目录操作的选择。还探讨了源代码引用和脚本应用到服务管理中的实例,如Nginx服务的启动、停止和状态检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法

1)
函数名称 () {
    statement
    statement
}

2)
function 函数名称 {
    statement
    statement

}
调用函数 函数名称
也可以通过位置变量的方式给函数传递参数

用法:function+case 目录管理

[root@Labatt shell]# cat function.sh 
#!/bin/bash
create_dir (){
echo 1
        read -p "please input dir_name " dir
        if [ -e $dir ];then
          echo "$dir exis"
        else
          mkdir -p $dir
        fi  
}

remove_dir(){
echo 2
        read -p "please input dir_name " dir
        if [ -e $dir ];then
          rm -rf $dir
        fi
}


cat << eof
========================
        目录管理
1、创建目录
2、删除目录
3、退出脚本
eof

while true; do
read -p "please input your choice " choice
case $choice in
  1)
    create_dir
    ;;
  2)
    remove_dir
    ;;
  3)
    exit 0
    ;;
  *)
    echo "input error"
    ;;
esac
done

用法二:写脚本引用某个脚本的函数source或者.

[root@Labatt shell]# cat function2.sh 
#!/bin/bash
#source /admin/shell/function.sh &>/dev/null
. /admin/shell/function.sh &>/dev/null
create_dir
remove_dir

 用法三:应用到服务管理

[root@Labatt init.d]# cat nginx 
#!/bin/bash
nginx_cmd=/usr/local/service/nginx/sbin/nginx
nginx_conf=/usr/local/service/nginx/conf/nginx.conf
nginx_pid_file=/usr/local/service/nginx/logs/nginx.pid


start() {
   $nginx_cmd
   if [ $? -eq 0 ];then
        echo "服务nginx启动..."
   else
        echo "start failed"
   fi
}

stop() {
   $nginx_cmd -s stop

}

reload() {
   if $nginx_cmd -t &> /dev/null;then
       $nginx_cmd -s reload
   else
       $nginx_cmd -t
   fi
}

status() {
   if [ -e $nginx_pid_file ];then
     echo "nginx is started pid is $(cat $nginx_pid_file)"
   else
     echo "nginx is stop"
   fi
}

restart() {
 $nginx_cmd -s stop && $nginx_cmd 
}

if [ -z $1 ];then
 echo "使用 {start;stop;status;reload;restart}"
 exit 9
fi

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  reload)
    reload
    ;;
  status)
    status
    ;;
  *)
    echo "使用 {start;stop;status;reload;restart}"
    exit 8
esac

<think>好的,我现在需要在Shell脚本中找到打印函数名称的方法。用户的问题是如何在脚本中获取当前执行的函数名。首先,我应该回忆一下Shell脚本中函数的相关知识,特别是关于如何获取函数名的方式。 我记得在Bash中,有一些特殊的变量,比如$0表示脚本名称,$1、$2等是位置参数。可能有没有类似的变量用于函数内部获取函数名呢?或者有没有其他方法? 然后,我想到可能使用Bash的内置命令或者变量。例如,FUNCNAME数组可能存储了调用栈中的函数名。当前函数的名字应该是FUNCNAME数组的第一个元素,也就是${FUNCNAME[0]}。不过需要确认这个变量的可用性,尤其是在不同的Shell环境中,比如是否只适用于Bash,还是其他Shell如sh、zsh也支持。 接下来,我需要验证这个思路是否正确。假设在函数内部使用echo ${FUNCNAME[0]},是否能正确输出函数名。比如,定义一个函数my_func,然后在其中打印这个变量,看看结果是否为my_func。 另外,用户可能希望在不硬编码函数名的情况下动态获取,比如在多个函数中复用相同的代码来打印各自的名称。这时候使用FUNCNAME变量会比较方便,因为不需要在每个函数里写死名字。 不过需要注意,FUNCNAME是Bash特有的变量,可能在其他的Shell环境中不可用。如果脚本开头指定的是#!/bin/bash,那应该没问题。但如果使用#!/bin/sh,可能会遇到兼容性问题,因为sh可能是链接到dash或其他Shell,这时候FUNCNAME可能不存在。 用户的问题中没有明确说明使用哪种Shell,但根据引用的参考资料中提到的function定义方式,可能用户使用的是Bash,因为function关键字在Bash中是支持的,而sh可能不支持这种语法。因此,可以合理假设用户的环境是Bash,推荐使用FUNCNAME变量。 还有一种方法是利用调试信息,比如使用set -x来显示执行的命令,但这可能不是用户想要的直接获取函数名的方式。或者,在函数内部使用外部命令如ps或caller,但这些方法可能比较复杂。 总结起来,最直接的方法是在Bash中使用${FUNCNAME[0]}来获取当前函数名。同时,可以提供一个示例代码,让用户测试这种方法是否有效。此外,提醒用户注意Shell的兼容性问题,确保脚本在Bash下运行。</think>在Shell脚本中打印当前执行的函数名称,可以通过Bash内置的`FUNCNAME`数组实现。以下是具体方法和示例: ### 方法说明 1. **`FUNCNAME`数组** Bash环境中,`FUNCNAME`数组存储了当前调用栈中的函数名称,其中`${FUNCNAME[0]}`表示当前执行的函数名,`${FUNCNAME[1]}`表示调用当前函数的父函数名,依此类推[^2]。 2. **适用场景** 此方法仅适用于Bash脚本(脚本需以`#!/bin/bash`开头),不保证在`sh`或其他Shell中可用。 ### 实现示例 ```bash #!/bin/bash my_function() { echo "当前函数名: ${FUNCNAME[0]}" } # 调用函数 my_function ``` 运行结果: ``` 当前函数名: my_function ``` ### 扩展应用 若需在嵌套函数中追踪调用链: ```bash parent_func() { child_func() { echo "当前函数链: ${FUNCNAME[@]}" } child_func } parent_func ``` 运行结果: ``` 当前函数链: child_func parent_func ``` ### 注意事项 - **Shell兼容性**:`FUNCNAME`为Bash特有变量,若脚本需兼容`sh`,需改用其他方法[^1]。 - **调试技巧**:结合`set -x`可观察函数执行流程,辅助调试[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值