你该认识这样的Linux_shell函数使用案例

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你该认识这样的Linux_shell函数使用案例相关的知识,希望对你有一定的参考价值。

Linux shell之函数

声明与简介

Shell是系统的用户界面,它提供了用户跟内核进行交互的桥梁。Shell是一个命令解释器,它接收用户输入的命令并送到内核去执行。

本文主要介绍Shell里函数的常见使用方法。

使用函数

函数概述

函数shell脚本执行时的代码块,它实际上为了完成特定任务而构建出来的命令集。比如我们之前介绍的代码段可以定义在一个函数里,方面重复调用。

# 编写函数,读取当前文件pip_3.txt里的每一行内容并显示行号。
#!/bin/bash
getcontent()
{
local num=0
while read line
do
let num++
echo -e "文件$file的第$num行是:\\t$line"
done < ./pip_3.txt
}
getcontent

#调用及结果
./shell_ifs.sh
文件的第1行是:	Package	Version
文件的第2行是:	attrs	19.3.0
文件的第3行是:	Automat	0.8.0
文件的第4行是:	boto3	1.10.28

定义和使用参数

#编写函数,读取当前文件指定文件里的每一行内容并显示行号。
#!/bin/bash
getcontent()
{
local num=0
while read line
do
let num++
echo -e "文件$file的第$num行为:\\t$line"
done < $file
}
file=$1
getcontent

#调用及结果
./shell_ifs.sh pip_3.txt
文件的第1行是:	Package	Version
文件的第2行是:	attrs	19.3.0
文件的第3行是:	Automat	0.8.0
文件的第4行是:	boto3	1.10.28

返回控制

#编写函数,读取当前文件指定文件里的每一行内容并显示行号。这里读取到第3行即截止。
getcontent()
{
local num=0
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\\t$line";
if ([ $num -eq 3 ]);then
#if (($num -eq 3));then
echo "结束在第三行"
return
fi
done < $file
}
file=$1
getcontent

#调用及结果
./shell_ifs.sh pip_3.txt
文件的第1行是:	Package	Version
文件的第2行是:	attrs	19.3.0
文件的第3行是:	Automat	0.8.0
文件的第4行是:	boto3	1.10.28

注:1 这里算数比较时如果用-eq方式,则中括号“[、]”两边都得有空格。
2 shell的if判断需要两个括号。

返回值结合判断

#对文件行数遍历,超过4行的打印行数并提示超过,反之则反。
#!/bin/bash
getcontent()
{
local num=0
while read line
do
let ++num;
done < $1
echo $num
return $num
}
#result=0
result=$(getcontent $1)
if (( $result > 4 ));then
echo "当前$result行超过4行"
else
echo "当前$result行小于等于4行"
fi

#执行及结果
./del.sh pip_3.txt 
当前4行小于等于4行
./del.sh emp.txt
当前18行超过4行

局部变量

# 通过局部变量方式访问文件。这里定义file变量为局部变量。

#!/bin/bash
getcontent()
{
local num=0
local file=$1
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\\t$line";
if ([ $num -eq 3 ]);then
#if (($num -eq 3));then
echo "结束在第三行"
return
fi
done < $file
}
getcontent $1

# 调用及结果
./shell_ifs.sh pip_3.txt

文件的第1行是:	Package	Version
文件的第2行是:	attrs	19.3.0
文件的第3行是:	Automat	0.8.0
文件的第4行是:	boto3	1.10.28

函数式环境变量

我们知道环境变量一般是预定义的值,比如$JAVA_HOME。而函数也是可以定义在环境变量里的。

# 将获取文件行和内容的函数定义在环境变量里,直接在shell里输入函数的整体内容。
# Step1 定义函数
getfilecontent()
> {
> local num=0
> while read line
> do
> let ++num;
> echo -e "文件$file的第$num行是:\\t$line";
> if ([ $num -eq 3 ]);then
> echo "结束在第三行"
> return
> fi
> done < $1
> }

# Step2定义函数环境变量
export -f getfilecontent

# Step3 子shell调用,比如在another.sh里定义如下:
#!/bin/bash
getfilecontent emp.txt

#结果
./another.sh

文件的第1行是:	7369,smith,clerk,7902,'1980-12-17',800,null,20
文件的第2行是:	7499,allen,salesman,7698,'1981-2-20',1600,300,30
文件的第3行是:	7521,ward,salesman,7698,'1981-2-22',1250,500,30
结束在第三行


延展:
1 这种函数式环境变量仅在定义的shell内有效,其它shell无效。
./ another.sh:行3: getfilecontent: 未找到命令

2 取消函数式环境变量的定义可通过unset命令
unset -f getfilecontent

如果再次执行之前的shell则会报如下错:
./del.sh:行3: getfilecontent: 未找到命令


3 查看函数式环境变量的定义,可通过env命令查看:

变量范围

# 局部变量仅作用于函数内,如果与全局变量重名,那么在函数内以局部变量为准。如下是示例代码。num既定义为全局变量又定义为局部变量,而函数体内以局部变量为准。

getfilecontent()
{
local num=0
echo -e "num的值:\\t $num"
#local file=$1
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\\t$line";
if ([ $num -eq 3 ]);then
#if (($num -eq 3));then
echo "结束在第三行"
return
fi
done < $filename
}
filename=$1
num=10
getfilecontent
echo -e "num的值:\\t $num"

#调用及结果
./shell_ifs.sh emp.txt
num的值:	 0
文件的第1行是:	7369,smith,clerk,7902,'1980-12-17',800,null,20
文件的第2行是:	7499,allen,salesman,7698,'1981-2-20',1600,300,30
文件的第3行是:	7521,ward,salesman,7698,'1981-2-22',1250,500,30
结束在第三行
num的值:	 10

位置参数

位置参数即按照函数从左到右的顺序传递参数,一般有$1到$10,10个参数,如果超过10个,用${n}来代替,可通过循环遍历。

#位置参数的例子,见
#!/bin/bash
getfilecontent()
{
local num=0
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\\t$line";
if ([ $num -eq 3 ]);then
echo "结束在第三行"
return
fi
done < $1}
getfilecontent $1

#调用及结果
./shell_ifs.sh demo.txt 
文件的第1行是:	1 name
文件的第2行是:	2 addr
文件的第3行是:	3 school
结束在第三行

SET内置参数

#通过set设置内置参数

#!/bin/bash
getfilecontent()
{
set ./demo.txt 2  
local num=0
while read line
do
let ++num;
echo -e "文件$file的第$num行是:\\t$line";
if ([ $num -eq $2 ]);then
echo "结束在第$2行"
return
fi
done < $1
}
num=10
getfilecontent $1 $2

#调用与结果,未指定任何参数,使用内置的值。
 ./shell_ifs.sh 
文件的第1行是:	1 name
文件的第2行是:	2 addr
结束在第2行

递归调用

递归是一种函数的返回值作为输入反复调用的一种特殊函数。

#计算一个数的累加值。
#!/bin/bash
cal_add(){
if [ $1 -eq 1 ]
then
echo 1
else
local tmp=$(( $1 -1 ))
local result=$(cal_add $tmp)
echo $(( $result + $1 ))
fi
}
read -p "请输入一个数:" num
f=$(cal_add $num)
echo -e "数$num的累加值:\\t $f"

#执行及结果
./accuadd.sh
请输入一个数:3
数3的累加值:	 6

 

以上是关于你该认识这样的Linux_shell函数使用案例的主要内容,如果未能解决你的问题,请参考以下文章

你该认识这样的Linux_shell之变量操作符与循环分支

Linux_Shell脚本编程之read读取控制台输入

Linux_shell

Linux_shell

系统总出故障怎么办,或许你该学学稳定性建设!

Linux_shell 编程