专业编程基础技术教程

网站首页 > 基础教程 正文

Bash函数用法(3):使用函数名作为函数指针,在函数内cd的影响

ccvgpt 2024-10-12 14:06:53 基础教程 9 ℃

本系列文章介绍在 Linux Bash shell 中使用函数的一些实例,包括下面的内容:

  • 定义函数的格式
  • 从函数中返回内容
  • 使用函数名作为函数指针
  • 函数内执行cd命令的影响
  • 声明函数内的变量为局部变量
  • 获取传入函数的所有参数

使用函数名作为函数指针

在 bash 中,可以通过如下的方式来达到类似C语言函数指针的效果。假设有一个 test.sh 脚本,内容如下:

Bash函数用法(3):使用函数名作为函数指针,在函数内cd的影响

#!/bin/bash

# 注意$1后面有一个分号';', 少这个分号会报错
echo_a() { echo aaaa $1; }
echo_b() { echo bbbb $1; }
if [ "$1" == "-a" ]; then
 # 这里的 echo_a 没有加双引号
 echo_common=echo_a
elif [ "$1" == "-b" ]; then
 # 上面的echo_a没加双引号, 这里加了.
 # 实际上, 可加可不加, 都可以正确执行.
 echo_common="echo_b"
else
 echo ERROR; exit 1
fi
${echo_common} common

这个脚本通过 echo_common 变量来保存函数名,相当于是函数指针,再通过 ${echo_common} 来调用它保存的函数

在 bash shell 中执行 ./test.sh -a 命令,会输出 "aaaa common";执行 ./test.sh -b 命令,会输出 "bbbb common"。

函数内执行cd命令的影响

在函数里面执行 cd 命令,切换到某个目录后,函数退出时,当前工作目录还是会保持在那个目录,而不会自动恢复为原先的工作目录,需要手动执行 cd - 命令再切换回去。

假设有一个 testcd.sh 脚本,里面的内容如下:

#!/bin/bash

echo "now, the pwd is: $(pwd)"
cd_to_root() { cd /usr/; }
cd_to_root
echo "after execute the cd_to_root, pwd is: $(pwd)"

这个函数先打印出执行脚本时工作目录路径,然后执行自定义的 cd_to_root 函数,在函数内部切换工作目录到 "/usr/",最后在 cd_to_root 函数外面打印工作目录路径。

执行 ./testcd.sh 脚本,会输出下面的内容:

[~/sample]$ ./testcd.sh
now, the pwd is: /home/sample
after execute the cd_to_root, pwd is: /usr
[~/sample]$ pwd
/home/sample

可以看到,如果在函数里面执行过 cd 命令,函数退出后,当前工作目录还是 cd 后的目录。但是脚本执行结束后,当前 shell 的工作目录还是之前的工作目录,不是脚本里面 cd 后的目录。

在每个 shell 下面,当前工作目录 (working directory ) 是全局的状态,一旦改变,在整个 shell 里面都会改变。

而 bash 执行脚本时,是启动一个新的子 shell 来执行,所以脚本内部执行 cd 命令,会影响运行这个脚本的子 shell 的工作目录,但不影响原先父 shell 的工作目录。

PS:未完待续,下篇文章会继续说明,敬请期待~

Tags:

最近发表
标签列表