AI智能
改变未来

Shell脚本学习笔记(3)——函数的调用以及变量的作用域


由于Shell编程主要是依赖于Linux,将Linux的命令经过一系列的操作从而完成一个复杂的功能。如果你没有Linux基础,没有Shell的一些基础知识,建议你先看博主之前写的文章。
传送门:
Linux常用的终端命令汇总(超详细,超全面)收藏这一篇就够了
Shell学习笔记(1)——Shell的基本原理及Shell编程初体验
Shell学习笔记(2)——Shell变量及常用的程序语句详细介绍

小伙伴们一定要看到文章结束啊!文末提供有Shell学习的电子书

小伙伴们一定要看到文章结束啊!文末提供有Shell学习的电子书

小伙伴们一定要看到文章结束啊!文末提供有Shell学习的电子书

文章目录

  • Shell函数的调用
  • 脚本中调用函数的格式
  • 脚本中函数调用示例
  • 从函数文件中调用函数
  • 函数变量作用域
    • 示例
  • 文末送福利
  • Shell函数的调用

    使用函数可以节省大量的脚本编写时间。创建可用和可重用的脚本很有意义,可以使主脚本变短,结构更加清晰。当创建了许多函数后,将之放入函数文件里,然后其他脚本就可以使用这些函数了。

    脚本中调用函数的格式

    方式一:

    value_name=\'function_name [arg1 arg2 ...]\' #函数的所有标准输出都传递给了主程序的变量

    方式二:

    function_name [arg1 arg2 ...]echo $? #得到函数的返回值的状态

    脚本中函数调用示例

    grep_user()  #定义一个筛选用户的函数{R=\'grep \"$1\" /etc/passwed | wc -l\'#如果有该用户,则通过命令置换赋值给Recho $R #打印出是否有该用户,如果有该用户则打印1,没有打印0return $R}echo -n \"input username:\" #提示输入用户名read USERgrep_user $USER #调用筛选用户的函数# echo \"-$?-\" #打印出函数的返回值RET=$?if [ $RET -eq 1] #如果返回值是1thenecho \"$USER exitst\" #提醒存在用户elseecho \"$USER no_exitst\" #提醒不存在用户fi

    注意:如果定义的函数没有返回值,那么会将函数的打印值作为返回值传递给调用该函数的变量。
    当我们运行以上程序是会发现有bug,当输入某些不存在的用户时,依旧会提示该用户存在。这是为什么呢?
    仔细观察代码会发现,读入的变量没有限制,而这个变量有可能恰巧是存在用户中的连续字母,从而导致了bug。可能文字有点绕,那么通过举一个例子来说明吧!
    本来存在一个名字为linux的用户,当我们输入linux的时候,毫无疑问是存在该用户的,没有问题。然而当我们输入lin的时候发现也会提示存在该用户,这就是原因所在——因为它和存在的用户名中的字母重复了。
    通过以上分析,发现了问题所在,那么就快点改bug吧!将定义的

    grep_user()

    函数改成一下内容:

    grep_user()  #定义一个筛选用户的函数{R=\'grep \"^$1:\" /etc/passwed | wc -l\'#如果有该用户,则通过命令置换赋值给Recho $R #打印出是否有该用户,如果有该用户则打印1,没有打印0return $R}

    注意变化,是将第三行的命令置换给改了一下,必须要满足条件
    ①以输入的字母开头
    ②以冒号结束

    从函数文件中调用函数

    前面讲述了怎样在命令行中调用函数,这类函数通常用于系统报表功能。现在再次使用上面的函数,但是这次将之放入函数文件 functions.sh里。 function.sh文件内容如下:

    #!/bin/bash#functions.sh#主要脚本的功能is_it_a_directory(){# to ca11: is_it_a_directory directory_nameif[$#-1t1];thenecho \"is_it_a_directory: I need a directory name to check\"return 1fi# is it a directory ?DIRECTORY_NAME=$1if[ ! -d $DIRECTORY_ NAME ] ; thenreturn 1elsereturn 0fi}error_ _msg(){echo -e \"\\007\"echo $@echo -e \"\\007\"return 0}

    现在编写脚本就可以调用function.sh中的函数了。注意函数文件在脚本中以下述命令格式定位:

    . \\<path to file>

    使用这种方法不会创建另一个shell,所有函数均在当前 shell下执行。

    新建一个文件夹并命名为

    direc_ check

    ,内容如下:

    !/bin/bashecho -n \" enter destination directory :\"read DIRECif is_it_a_directory $DIRECthen :elseerror_msg \" $DIREC does not exist...creating it now\"mkdir $DIREC > /dev/nu11 2>&1#将标准输出,错误输出都重定向至/dev/null,也就是全部丢弃if[$?!=0]thenerror_msg \"Cou1d not create directory:: check it out!\"exit 1else :fiecho \"extracting files...\"

    以上代码中用到了输出重定向的知识,博主这里就不详细介绍了,因为已经有其它的博主写的很详细了——文章传送门:Shell中的>/dev/null 2>&1 与 2>&1 >/dev/null 与&>/dev/null 的区别

    函数变量作用域

    • 全局作用域:在脚本的其它任何地方都能够访问到该变量
    • 局部作用域:只能声明变量的作用域内访问
    • 声明局部变量的格式:
      Local variable_name =value

    示例

    grep_user(){A=100B=200}grep_userecho \"end:$A-$B\"

    很过小伙伴可能会想到C语言中,这样应该会报错啊!实际上是不会报错的,因为在上面函数内定义的A变量和B变量依旧是全局变量。定义局部变量必须在变量名前加上local

    grep_user(){local A=100B=200}grep_userecho \"end:$A-$B\"

    可以看到打印结果没有A

    文末送福利

    Shell学习电子书
    提取码:yvgg

    不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,

    用知识来改变命运,用博客见证成长,用行动证明我在努力


    如果我的博客对你有帮助、如果你喜欢我的博客内容,请

    “点赞” “评论” “收藏”

    一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Shell脚本学习笔记(3)——函数的调用以及变量的作用域