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

   日期:2020-05-18     浏览:105    评论:0    
核心提示:Shell是用户和Linux内核沟通的桥梁,所以学习Shell是很有必要的。文章主要分享了一些Shell的基础知识,以及Shell函数如何定义,调用。以及使用注意事项!同时文章末尾也分享了学习Shell的电子书。很适合新手入门进行学习。shell

       由于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'#如果有该用户,则通过命令置换赋值给R
	echo $R #打印出是否有该用户,如果有该用户则打印1,没有打印0
	return $R
}

echo -n "input username:" #提示输入用户名
read USER
grep_user $USER #调用筛选用户的函数
# echo "-$?-" #打印出函数的返回值
RET=$?
if [ $RET -eq 1] #如果返回值是1
then 
	echo "$USER exitst" #提醒存在用户
else
	echo "$USER no_exitst" #提醒不存在用户
fi

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

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

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

从函数文件中调用函数

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

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

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

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

       新建一个文件夹并命名为direc_ check,内容如下:

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

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

函数变量作用域

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

示例

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

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

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

可以看到打印结果没有A

文末送福利

       Shell学习电子书
       提取码:yvgg

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

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服