一、函数
在编写脚本时,有些脚本可以反复使用,可以调用函数来解决
语句块定义成函数约等于别名
函数使用方法:
- 定义函数
- 再引用函数
1. function 函数名{ 命令序列 } 2. 函数名(){ 命令序列 } 3. function func_name () { ...函数体... }
注意事项:
- 直接写函数中调用函数 直接写函数名
- 同名函数后一个生效
- 调用函数一定要先定义
- 只要先定义了调用的 其他函数定义顺序无关
func_name (){ ...函数体... } 一、定义函数: [root@localhost data]#func1 (){ hostname;date;} 1、定义函数 [root@localhost data]#func1 2、调用函数 localhost.localdomain 2021年 10月 23日 星期六 10:23:50 CST 3、注意调用的位置 h () { echo "hello" } nihao () { echo `h` `w` } w () { echo "world" } nihao #### 同名函数
1.1查看函数
[root@localhost ~]# declare -F #函数列表 declare -f __HOSTNAME declare -f __SIZE declare -f __SLAVEURL [root@localhost ~]# declare -f #函数具体的定义 判断操作系统版本: [root@localhost ~]#cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
1.2删除函数
unset func_name #删除函数 [root@localhost ~]# dir anaconda-ks.cfg pricegame.sh sum.sh 公共 视频 文档 音乐 initial-setup-ks.cfg sum1.sh yum.sh 模板 图片 下载 桌面
1.3函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值
使用原则:
- 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
- 退出码必须是0-255,超出的值将为除以256取余
#!/bin/bash test1 () { read -p "请输入一个数字:" num return $[$num*2] } test1 echo $?
怎么解决超过 255
#!/bin/bash test1 () { read -p "请输入一个数字:" num echo $[$num*2] } result=`test1` echo $result
return 的用法: user () { if [ $USER = root ] then echo "这是管理员用户" else echo "这不是管理员用户" return 1 fi }
1.4函数的传参数
方法一: sum1 (){ sum=$[$1 +$2] echo $sum } read -p "请输入第一个参数:" num1 read -p "请输入第一个参数:" num2 sum1 $num1 $num2 方法二: sum1 () { sum=$[$1 + $2] echo $sum } sum1 10 20
函数变量的作用范围:
- 函数在shell脚本中仅在当前的shell环境中有效
- shell脚本中函数的变量默认全局有效
- 将变量限定在函数内部使用local命令
[root@localhost opt]# vim demo8.sh #!/bin/bash myfun(){ i=8 echo $i } myfun [root@localhost opt]# chmod +x demo8.sh [root@localhost opt]# ./demo8.sh 8 ------------------------------------------------------ [root@localhost opt]# vim demo8.sh #!/bin/bash myfun(){ i=8 echo $i } myfun echo $i [root@localhost opt]# ./demo8.sh 8 8 -------------------------------------------------------- [root@localhost opt]# cat demo8.sh #!/bin/bash myfun(){ i=8 echo $i } i=9 myfun echo $i [root@localhost opt]# ./demo8.sh 8 8 --------------------------------------------------- [root@localhost opt]# cat demo8.sh #!/bin/bash myfun(){ i=8 echo $i } myfun i=9 echo $i [root@localhost opt]# ./demo8.sh 8 9
1.5使用函数文件
我们可以新建一个专门存放函数的文件
[root@localhost data]#vim functions ostype (){ if grep -i -q "linux 6" /etc/os-release then echo "centos6" elif grep -i -q "linux 7" /etc/os-release then echo "centos7" elif grep -i -q "linux 8" /etc/os-release then echo "centos8" else color () { RED="echo -e \E[31m" GREEN="echo -e \E[32m" END="\E[0m" 引用时 [root@localhost data]#. functions [root@localhost data]#ostype centos7 ----------------------------------------------------- [root@localhost data]#color [root@localhost data]#${GREEN}MMM$END ##会变颜色 MMM ---------------------------------------------------- [root@localhost data]#vim os.sh [root@localhost data]#bash os.sh centos7 XXXX -------------------------------------------------------
1.6函数的作用范围
[root@localhost ~]#name=qian [root@localhost ~]#func1 () { name=li ; echo $name; } [root@localhost ~]#func1 li [root@localhost ~]#echo $name li [root@localhost ~]#name=qian;func1 () { local name=li ;echo $name; };echo $name #加上local变量即可将变量限制在函数内qian
1.7函数递归
函数调用自己本身的函数
#阶乘:5!表示为:1* 2 * 3 * 4 * 5
用for循环 #!/bin/bash sum=1 read -p "请输入一个数字:" num for i in `seq $num` do let sum=$[i*sum] done echo $sum 函数调用自己 #!/bin/bash # fact() { if [ $1 -eq 0 -o $1 -eq 1 ] then echo 1 else echo $[$1*$(fact $[$1-1])] fi } fact $1
二、数组
2.1基础
(1)定义数组格式:
1. 数组名=(value0 value1 value2 value3 ......)
2. 数组名=([0]=value [1]=value1 [2]=value2 ....)
3. 列表名="value0 value1 value2 value3 ...... "
数组名=($列表名)
4. 数组名[0]="value1"
数组名[1]="value2"
数组名[2]="value3"
(2)数组的包括数据类型:
- 数值型
- 字符型
- 混合型数值加字符
注意:使用" "或' '定义单引号或双引号括起来
[root@localhost ~]# a=(1 2 3 4 5) 0 1 2 3 4 [root@localhost ky15]#declare -a declare -a a='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")' [root@localhost ~]# echo ${!a[*]} #查看下标 0 1 2 3 4 [root@localhost ~]# echo ${a[0]} #数组的取值 数组加下标 1 输出第一一个数值 注意是从0开始计算 列出所有参数 [root@localhost ~]# echo ${a[*]} //*代表所有参数 1 2 3 4 5 [root@localhost ~]# echo ${a[@]} //@同* 1 2 3 4 5 共有多少个位置 [root@localhost ~]# echo ${#a[@]} //前面加#数组的长度 5 [root@localhost ~]# echo ${#a[*]} 5 #数组分隔 [root@localhost ~]# a=(1 2 3 4 5) [root@localhost ky15]#echo ${a[@]:0:5} 1 2 3 4 5 [root@localhost ky15]#a[1]=9 #数组替换 [root@localhost ky15]#echo ${a[1]} 9 [root@localhost ky15]#echo ${a[@]} 1 9 3 4 5 [root@localhost ky15]#echo ${b[@]/西瓜/葡萄} #只是显示没有真正的修改 橘子 香蕉 葡萄 [root@localhost ky15]#echo ${b[@]} 橘子 香蕉 西瓜 [root@localhost ~]#list="1 2 3 4 5" #先定义列表 [root@localhost ~]#list1=($list) #再定义数组 [root@localhost ~]#echo ${list1[@]} 1 2 3 4 5
2.2冒泡排序
1、取出最大数 #!/bin/bash a=(10 70 30 40 50 60) max=${a[0]} for ((i=0;i<${#a[*]};i++)) do if [[ $max -lt ${a[$i+1]} ]] then max=${a[$i+1]} fi done echo $max 2、最大数和最小数 #!/bin/bash read -p "请输入正整数字,并已空格隔开:" num a=( $num ) max=${a[0]} for ((i=0;i<${#a[*]};i++)) do if [[ $max -lt ${a[$i+1]} ]] then max=${a[$i+1]} fi done echo "最大值是$max" min=${a[0]} for ((i=0;i<${#a[*]}-1;i++)) do if [[ $min -ge ${a[$i+1]} ]] then min=${a[$i+1]} fi done echo "最小值是$min" 3、排序算法,冒泡算法 a=10 b=20 对调结果 b=10 a=20 score=(72 63 88 91 45) #第一轮数字大的往后放 第一次 63 72 88 91 45 第二次 63 72 88 91 45 第三次 63 72 88 91 45 第四次 63 72 88 45 91 第一轮比较结束 一共比较四次(数组长度减一)最大的数字一定在最后 #第二轮数组长度减二 确定了第二大的数字 63 72 88 45 91 63 72 88 45 91 第一次 63 72 88 45 91 第二次 63 72 45 88 91 第三次 #第三轮数组长度减三 确定了第三大的数 63 72 45 88 91 63 72 45 88 91 第一次 63 45 72 88 91 第二次 #第四轮 数组长度减四 确定了第四大的数 63 45 72 88 91 45 63 72 88 91 第一次 #!/bin/bash a=(72 63 88 91 45) #外层为轮次 for ((i=1;i<${#a[*]};i++)) do for ((j=0;j<${#a[*]}-i;j++)) do if [ ${a[$j]} -gt ${a[`expr $j + 1`]} ] then tmp=${a[`expr $j + 1`]} a[`expr $j + 1`]=${a[$j]} a[$j]=$tmp fi done done echo ${a[@]}
2.3调试脚本
set -x read -p "请输入您的分数(0-100):" GRADE if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] then echo "$GRADE 分!优秀" set +x elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] then echo "$GRADE 分,合格" else echo "$GRADE 分?不合格" fi标签:脚本,Shell,函数,echo,sh,root,localhost,name From: https://www.cnblogs.com/feizirui/p/16829065.html