由于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
不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,
用知识来改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论” “收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。