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