函数
函数就是具备某一功能的工具
为什么要学习函数
如果不使用函数,那么你的代码:
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
函数参数和脚本参数
函数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 $?