函数


函数就是具备某一功能的工具

为什么要学习函数

如果不使用函数,那么你的代码:
1.程序的组织结构不清晰,可读性差
2.代码冗余      ------------- 减少代码量
3.可扩展性(功能需要修改的时候...对不起GG)

如何使用函数

函数的使用必须遵循的原则:先定义,后调用
修理工事先准备好工具的过程,即,定义函数
修理工遇到应用场景哪来工具就用即函数的调用

函数的语法

######  shell如何定义一个函数  #########
##### :(){ : | : & };: #####
# shell函数的()不要加任何东西
# 第一种
function 函数名字{
	命令1
	命令2
	命令3
}
# 第二种
function 函数名字(){
	命令1
	命令2
	命令3
}
# 第三种
函数名(){
	命令1
	命令2
	命令3
}

函数的使用

################## 如何调用函数 ###################
[root@m01 ~]# cat function.sh
#!/bin/bash
xxx(){ # 定义函数
	echo 123
}
xxx # 调用函数
[root@m01 ~]# sh function.sh
123

# 测试函数
#!/bin/bash
xxx(){
	yyy
}
yyy(){
	echo 123
}
yyy

# 实验1
[root@m01 ~]# cat function.sh
#!/bin/bash
name=$1               ###### shell脚本的传参
xxx(){
	echo $name
	echo $1           #######  函数有自己的传参
}
xxx 666
echo $1
[root@m01 ~]# sh function.sh abc
abc
666
abc

函数参数和脚本参数

image-20240708133555432

函数shell脚本实例

############# 安装软件脚本 ############
#!/bin/bash
install(){
	if [ $# -le 1 ];then
		echo "使用方法:$0 -i 安装 | -d 卸载 [需要安装的服务名]"
		exit
	fi
	if [ $1 -eq -i ];then
		yum install -y $2 &>/dev/null
		num=`rpm -qa | grep -c $2`
		if [ $num -gt 0 ];then
			echo '安装成功'
			return 6
		else
			echo '安装失败'
			return 7
		fi
	elif [ $1 -eq -d ];then
		yum remove -y $2 &>/dev/null
		num=`rpm -qa | grep -c $2`
		if [ $num -eq 0 ];then
			echo '卸载成功'
			return 8
	else
		echo '卸载失败'
		return 9
	fi
	else
		echo "请传递参数 -i \ -d"
	fi
}
install $1 $2
#######  源码安装nginx的脚本  ############
#!/bin/bash
if [ $2 != '-m' ];then
	echo "Usage: $0 hostname -m module -a action"
fi

# ansible 10.0.0.61 -m 'file' -a ""

module_judge (){
	module=$2
	if [ $module == 'file' ];then
        zls_file $4
	fi
}

zls_file (){
	for n in $*;do
		if [[ $n =~ 'src' ]];then
			src=`echo "${n}"|awk -F '=' '{print $2}'`
		elif [[ $n =~ 'dest' ]];then
			dest=`echo "${n}"|awk -F '=' '{print $2}'`
		elif [[ $n =~ 'mode' ]];then
			mode=`echo "${n}"|awk -F '=' '{print $2}'`
		elif [[ $n =~ 'owner' ]];then
			owner=`echo "${n}"|awk -F '=' '{print $2}'`
		fi
	done
	cp -a $src $dest
	chown ${owner:-root}.${owner:-root} ${dest}
	chmod ${mode:-600} ${dest:-600}
}	

main() {
}

循环

循环名称 循环含义 使用场景
while 当型循环 死循环、有条件的循环,一行一行的读取文件
do until循环 直到型循环,一直循环到不满足条件 没啥场景,因为有for循环
for循环 通用性 很多场景都可以使用
# while 当型循环
while 后面 + 条件表达式
只要条件满足就继续循环
直到条件不满足为止

# do until 直到型循环
do until 后面 + 条件表达式
他的条件只要不满足就一直循环
直到条件满足为止

# for循环
for x in () 

while循环

# 写法1
while [ 条件表达式 ];do
	cmd1
	cmd2
	cmd3
done

# 写法2
while [ 条件表达式 ]
do
	cmd1
	cmd2
	cmd3
done

# 死循环推荐方式
while true;do
	cmd1
	cmd2
done

while :;do
	cmd1
	cmd2
done

while [ 1 -gt 0 ];do
	echo 111
	sleep 2
done

# while 循环到10
n=1
while [ $n -le 10 ];do
	echo $n
	((n++))
done
bredk和continue
##  bredk:break命令允许跳出所有循环(终止执行后面的所有循环)。
while true;do
	read -p 'Please Input A Number: ' num
	if [ $num -ne 5 ];then
		echo "你输入的是 $num"
	else
		break
	fi
done

## continue 跳出循环: continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
while true;do
	read -p 'Please Input A Number: ' num
	if [ $num -ne 5 ];then
		echo "你输入的是 $num"
	else
		continue
		echo giao
	fi
done
while读取文件内容
############# 方法1 ##############
[root@m01 ~]# cat 1.sh
#!/bin/bash
exec < 1.txt       #----------- 将标准输入(stdin)重定向到文件 1.txt
while read line;do
	echo '--------'
	echo $line
done
[root@m01 ~]# sh 1.sh
--------
www.xx.com xxx
--------
blog.xx.com yyy
--------
wc.xx.com zzz

###############  方法2 ###############
[root@m01 ~]# cat 1.sh
#!/bin/bash
cat 1.txt | while read line;do   #--------------- 将文件通过管道符号将标准输入传递给while
	echo '--------'
	echo $line
done
[root@m01 ~]# sh 1.sh
--------
www.xx.com xxx
--------
blog.xx.com yyy
--------
wc.xx.com zzz

################ 方法3 #############
[root@m01 ~]# cat 1.sh
#!/bin/bash
while read line;do
	echo '--------'
	echo $line
done < 1.txt                   # ------------------ 将标准输入重定向到循环中
[root@m01 ~]# sh 1.sh
--------
www.xx.com xxx
--------
blog.xx.com yyy
--------
wc.xx.com zzz

until循环

# 他的条件只要不满足就一直循环
# 直到条件满足为止
###### 第一种表达方式 ##########
until [ 条件表达式 ];do
	cmd1
	cmd2
done
###### 第二种表达方式 ##########
until [ 条件表达式 ]
do
	cmd1
	cmd2
done

## until循环到10
x=1
until [ $x == 10 ];do
	echo $x
	((x++))
done

for循环

############## 语法一 #############
for var in [ 变量表达式 ];do
	cmd1
	cmd2
done

############## 语法二 #############
for var in [ 变量表达式 ]
do
	cmd1
	cmd2
done

变量表达式
	- 可以是文件中的内容(根据空格循环)
	- 可以是序列命令
	- 可以是数组中的内容
	- 可以是以空格为分隔的字符串
for循环读取文件中的内容
# 可以是文件中的内容(根据空格循环)
[root@m01 ~]# cat 1.txt
www.xx.com xxx
blog.xx.com yyy
wc.xx.com zzz

for domain in `cat 1.txt`;do
	echo '-------------'
	echo "$domain"
done
# 执行结果
-------------
www.xx.com
-------------
xxx
-------------
blog.xx.com
-------------
yyy
-------------
wc.xx.com
-------------
zzz
for循环读取序列
# 可以是序列命令
#!/bin/bash
for n in `seq 10`;do
	echo $n
done

1
2
3
4
5
6
7
8
9
10
for循环读取以空格分割的字符串
#!/bin/bash
for n in "xxx" "yyy" "zzz";do
	echo $n
done
[root@m01 ~]# sh for.sh
xxx
yyy
zzz
for循环读取数组
#!/bin/bash
array=(kk ld lxl wubai)
for n in ${array[*/@]};do
echo $n
done
for的死循环
[root@m01 ~]# cat for.sh
#!/bin/bash
for (( ; ; ));do
	echo 123
	sleep 2
done
[root@m01 ~]# sh for.sh
123
123
123

返回值-return

返回值(或退出状态码)是一个 8 位的无符号整数,因此它的有效范围是 0 到 255。具体来说:

0:表示成功。传统上,返回值 0 表示命令或脚本成功执行,没有错误。
1 到 255:表示错误或失败。不同的值可以用来表示不同类型的错误或失败。

shell脚本中的返回值 - return N

#!/bin/bash
# 定义函数
check_file_exists() {
    local file=$1           #-------------   local  表示这个变量只在函数中可用
    if [ -e "$file" ]; then
        echo "File '$file' 存在."
        return 0               #  ---------- 文件存在返回 0
    else
        echo "File '$file' 不存在"
        return 1              # --------------- 文件不存在返回 1
    fi
}

# 调用函数并检查返回值
check_file_exists "test.txt"

if [ $? -eq 0 ]; then
    echo "文件检查通过."
else
    echo "文件不通过."
fi

shell脚本中的返回值 - exit N

#!/bin/bash

# 进行其他操作,并设置脚本的返回值
if [ -e  1.txt]; then
    echo "文件存在"
    exit 6
else
    echo "文件不存在"
    exit 10
fi

echo $?