Shell多重循环与函数的使用

定义

[function]函数名(){
 命令序列
 [return x]

调用方法

函数名 [参数1] [参数2]

函数的作用范围

  • 函数在Shell脚本中仅在当前Shell环境中有效
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令
  • 示例
      函数内部变量通过local来实现
      通过定义myfun函数,其内部设置为局部变量i
      函数内部和外部分别赋值,进行结果验证

例1:两个数求和

[root@localhost ~]# vi sum.sh
#!/bin/bash
#函数求和
sum(){
    
    
   read -p "第一个数:" num1
   read -p "第二个数:" num2
   echo "您输入这两个数为 $num1和num2"
   sum=$(($num1+$num2))
   echo "这两个数的和为:$sum"
}
sum
[root@localhost ~]# chmod +x sum.sh
[root@localhost ~]# ./sum.sh
第一个数:10
第二个数:20
你输入这两个数为1020
这两个数的和为:30

例2:自定义函数

[root@localhost ~]# vim function
servicect1_usage(){
    
    
echo "Usage:service <service-name><start|stop|restart|reload|status>"
return 1
}
chk_centos_ver(){
    
    
grep "CentOS.*release 7." /etc/centos-release $> /dev/null && echo "7"
grep "CentOS.*release 6." /etc/centos-release $> /dev/null && echo "6"
grep "CentOS.*release 5." /etc/centos-release $> /dev/null && echo "5"
}
servicect1(){
    
    
[[ -z $1 || -z $2 ]] && servicectl_usage
[ $(chk_centos_ver)=="7" ] && systemctl $2 ${
    
    1}.service || service $1 $2
}
[root@localhost ~]# chmod +x function
[root@localhost ~]# source function
[root@localhost ~]# echo 'source /root/function' >> ~/.bashrc

例3:函数的作用范围

[root@localhost ~]# vim fun_scop.sh
myfun(){
    
    
local i
i=8
echo $i
}
i=9
myfun
echo $i
[root@localhost ~]# chmod +x fun_scope.sh
[root@localhost ~]# ./fun_scope.sh
8
9

函数参数

参数用法

函数名称 参数1 参数2 参数3 …

参数的表示方法

$1 $2 $3 $4 $5 $6 … ${10} ${11} …

例4:函数的参数

[root@localhost ~]# vim write_log.sh
#!/bin/bash
mydir=|/data/ outfile="${mydir}/my.log"
[ -e "${mydir}" ] || mkdir -p ${
    
    mydir}
appendfile(){
    
    
echo "$2" >> "$1"
}
appendfile ${
    
    outfile} "first line content."
appendfile ${
    
    outfile} "second line content."
[root@localhost ~]# chmod +x write_log.sh
[root@localhost ~]# ./write_log.sh
[root@localhost ~]# cat /data/my.log
first line content
second line content

递归函数

调用自己本身的函数

例5:递归函数

[root@localhost ~]# vim fun_recursion.sh
function list_files(){
    
    
for f in 'ls $1';
do
if [ -d "$1/$f ]
then
echo "$2$f"
list_files "$1/$f" " $2" else
echo "$2$f"
fi
done
}
list_files "/var/log" ""
[root@localhost ~]# chmod +x fun_recursion.sh

在这里插入图片描述

数组应用场景

  • 获取数组长度
  • 获取元素长度
  • 遍历元素
  • 元素切片
  • 元素替换
  • 元素删除

数组定义方法

  • 方法一
    数组名=(value0 value1 value2 …)
  • 方法二
    数组名=([0]=value [1]=value [2]=value …)
  • 方法三
    列表名=“value0 value1 value2 …”
    数组名=($列表名)
  • 方法四
    数组名[0]=“value”
    数组名[1]=“value”
    数组名[2]=“value”

数组包括的数据类型

  • 数值类型
  • 字符类型
     -使用"" 或 ‘’定义

获取数组长度

${数组名[@/*]}

[root@localhost ~]# arr_number=(1 2 3 4 5);
[root@localhost ~]# arr_length=${
    
    #arr_number[*]}
[root@localhost ~]# echo $arr_length
5

读取某下标赋值

${数组名[下表]}

[root@localhost ~]# for v in ${
    
    arr_number[@]}
>do
>   echo $v
>done
1
2
3
4
5

数组遍历

数组切片

${数组名[@/*]:起始位置:长度}

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${
    
    arr[@]}
1 2 3 4 5
[root@localhost ~]# echo ${
    
    arr[@]:0:2}
1 2
[root@localhost ~]# echo ${
    
    arr[@]:2:3}
3 4 5

数组的替换

${数组名[@/*]/查找字符/替换字符}

[root@localhost ~]# arr=(1 2 3 4 5)
[root@localhost ~]# echo ${
    
    arr[@]/4/66}
1 2 3 66 5
[root@localhost ~]# echo ${
    
    arr[@]}
1 2 3 4 5
[root@localhost ~]# arr=(${
    
    arr[@]/4/66})
[root@localhost ~]# echo ${
    
    arr[@]}
1 2 3 66 5

数组删除

unset

Shell脚本调试

echo命令

bash命令

  • 命令语法
    sh [-nvx] 脚本名
  • 常用选项
    -n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
    -v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
    -x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。

set命令

  • set -x:开启调节模式
  • set +x:关闭调节模式

例:

[root@localhost ~]# vim grade.sh
#!/bin/bash
set -x//开启调试模式
read -p"请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ]&&[$GRADE -le 100 ]
then
echo "$GRADE!优秀”_set tx//关闭调试模式
elif [$GRADE -ge 70 ]&&[ $GRADE -le 84 ]
then
echo "$GRADE分,仓格".else
echo "$GRADE?不合格”
fi

冒泡排序

方法一

[root@localhost ~]# vim maopao.sh
#!/bin/bash#冒泡排序
score=(70 30 40 100 50 60)
for ((i=1; i<$ {
    
    #score[*]};i++))
do
  for ((j=o; j< $ {
    
    #score[*]}-$i ; j++))
  do
        if [ $ {
    
    score[j]} -gt,$ {
    
    score[(($j+1))]}]
        then temp=$ {
    
    score[j]}
        score[j]=${
    
    score[($j+1))]}
        score[(($j+1))]=$temp
        fi
   done
done
echo $ {
    
    score[*]}
[root@localhost ~]# chmod +x maopao.sh
[root@localhost ~]# ./maopao.sh
30 40 50 60 70 100

方法二

[root@localhost ~]# vim maopao1.sh
#!/bin/bash
#冒泡排序
k=0
while true
do
read -p"是否需要输入数值?" do
  if [$do ="no""]
  then break
  fi
read -p."请输入第$(($k+1))个元素”key
  score[$k]=$key
  let k++
done
for ((i=1;i<$ {
    
    #score[*]};i++))
do
  for ((j=0; j< $ {
    
    #score[*]}-$i ; j++))
  do
       if [ $ {
    
    score[j]} -gt,$ {
    
    score[j+1]}]
       then temp=${
    
    score[j]}
            score[j]=$ {
    
    score[j+1]}
            score[j+1]=$temp
        fi
    done
done
echo ${
    
    score[*]}
[root@localhost ~]# chmod +x maopao1.sh
[root@localhost ~]# ./maopao1.sh
是否需要输入数值?y
请输入第1个元素5
是否需要输入数值?y
请输入第2个元素22
是否需要输入数值?y
请输入第3个元素15
是否需要输入数值?y
请输入第4个元素3
是否需要输入数值?y
请输入第5个元素120
是否需要输入数值?y
请输入第6个元素50
是否需要输入数值?no
3 5 15 22 50 120

猜你喜欢

转载自blog.csdn.net/weixin_49343462/article/details/109611407
今日推荐