shell函数与数组

Candy独角兽 / 2023-08-15 / 原文

目录
  • shell函数与数组
    • 1. shell函数
      • 1.1 函数定义
      • 1.2 函数调用的方法
      • 1.3 函数传参
      • 1.4 函数的作用范围
      • 1.5 函数的递归
      • 1.6 函数的返回值
      • 1.7 外部调用函数
      • 题目
    • 2. shell数组
      • 2.1 数组定义方法
      • 2.2 数组切片
      • 2.3 数组删除
      • 2.4 数组替换
      • 2.5 数组追加
      • 2.6 普通数组
      • 2.7 关联数组
    • 冒泡排序

shell函数与数组

1. shell函数

1.1 函数定义

  • 将命令序列按格式写在一起
  • 可方便重复使用命令序列

函数组成:函数名、函数体

[root@localhost ~]#help function  #函数帮助


函数格式:
function 函数名{
    命令序列
}

函数名(){
     命令序列
}

function 函数名(){
     命令序列
}
[root@localhost ~]#test () { ls; cd /opt; }
[root@localhost ~]#test
anaconda-ks.cfg  initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@localhost opt]#

1.2 函数调用的方法

[root@localhost ~]#vim test.sh
#!/bin/bash
os () {
 if grep -qi 'centos' /etc/os-release
 then
 echo "centos"
 elif grep -qi 'ubuntu' /etc/os-release
 then
 echo "ubuntu" 
 else
 echo "this system not support"
fi
}

os
if [ `os` = centos ]
then
yum install httpd -y
elif [ `os` = ubuntu ]
then
apt install apache2 -y
else
echo "不支持"
fi

[root@localhost ~]#bash test.sh
centos
已加载插件:fastestmirror, langpacks
base                                               
  正在安装    : httpd-2.4.6-99.el7.centos.1.x86_64                                                              3/3 
  验证中      : httpd-2.4.6-99.el7.centos.1.x86_64                                                              1/3 
  验证中      : mailcap-2.1.41-2.el7.noarch                                                                     2/3 
  验证中      : httpd-tools-2.4.6-99.el7.centos.1.x86_64                                                        3/3 

已安装:
  httpd.x86_64 0:2.4.6-99.el7.centos.1                                                                              

作为依赖被安装:
  httpd-tools.x86_64 0:2.4.6-99.el7.centos.1                      mailcap.noarch 0:2.1.41-2.el7                     

完毕!

[root@localhost ~]#scp test.sh 192.168.8.106:/opt/





[root@localhost ~]#vim hello.sh
#!/bin/bash
h () {
echo "hello"
}
nihao () {
echo `h`  `w`
}

w () {
echo "world"
}

nihao


[root@localhost ~]#bash hello.sh
hello world
[root@localhost ~]#bash -x hello.sh
+ nihao
++ h
++ echo hello
++ w
++ echo world
+ echo hello world
hello world


1.3 函数传参

[root@localhost ~]#vim sum.sh
#!/bin/bash
sum (){
   echo $1
   echo $2
   echo $3
}
sum $2 $3 $1
#外面脚本的位置变量

[root@localhost ~]#cat sum.sh
#!/bin/bash
sum (){
   echo $1
   echo $2
   echo $3
}
sum $2 $3 $1
[root@localhost ~]#bash sum.sh a b c
b
c
a


1.4 函数的作用范围

[root@localhost data]#name=lj
[root@localhost data]#test () { name=tu; }
[root@localhost data]#echo $name
lj
[root@localhost data]#test
[root@localhost data]#echo $name
tu

1.5 函数的递归

  • 函数调用自己本身的函数
[root@localhost data]#vim com.sh
#!/bin/bash
read -p "请输入你要计算的阶乘数值(正整数)" num
sum=1

for i in `seq $num`
do
sum=$[ i*sum ]

done

echo $sum

[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)5
120
[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)4
24
[root@localhost data]#bash com.sh
请输入你要计算的阶乘数值(正整数)3
6


[root@localhost data]#cat fact.sh
#!/bin/bash
#求5的阶乘,需要5-1=4 (1*2*3*4)*5

fact () {
read -p "请输入要求的阶乘:" num
if [ $num -eq 0 -o $num -eq 1 ]
then
echo 1
else
   temp=$[$num-1]
   #求前一个数
   result= $(fact $temp)
   #求前一个数阶乘结果
   echo  $[ $num * $result ]
   #求现在的数的阶乘
fi
}
fact $num

1.6 函数的返回值

[root@localhost ~]#vim return.sh
#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        return $[$num*2]
}
test1
echo $?

[root@localhost ~]#bash return.sh
请输入一个数字:123
246


1.7 外部调用函数

[root@localhost ~]#vim func
os(){
 if grep -qi 'centos' /etc/os-release
 then
 echo "centos"
 elif grep -qi 'ubuntu' /etc/os-release
 then
 echo "ubuntu"
 else
 echo "this system not support"
 fi
}

color () {
RED="echo -e \E[31m"
GREEN="echo -e \E[32m"
BLUE="echo -e \E[34m"
LIGHTBLUE="echo -e \E[36m"
END="\E[0m"
}

[root@localhost ~]#. func
[root@localhost ~]#color
[root@localhost ~]#${BLUE} abcde
 abcde


[root@localhost ~]#vim function.sh
#!/bin/bash
. /root/func

os

if [ `os` = centos ]
then
yum install httpd -y
elif [ `os` = ubuntu ]
then
apt install apache2 -y
else
echo "no support"
fi

color
$BLUE 安装成功 $END

[root@localhost ~]#rpm -q httpd
未安装软件包 httpd 
[root@localhost ~]#bash function.sh
centos
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.bfsu.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.bfsu.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 httpd.x86_64.0.2.4.6-99.el7.centos.1 将被 安装
  正在安装    : httpd-2.4.6-99.el7.centos.1.x86_64                                                             1/1 
  验证中      : httpd-2.4.6-99.el7.centos.1.x86_64                                                             1/1 

已安装:
  httpd.x86_64 0:2.4.6-99.el7.centos.1                                                                             

完毕!
 安装成功 



题目

1.DNS作用是实现IP地址和主机名(域名)之间的映射,Linux系统   文件定义了DNS的Nameserver
/etc/resolv.conf

2.结束后台进程的命令是   
kill

3.为脚本指定执行权的命令及参数是
chmod +x

4.欲发送10个分组报文测试与主机 www.aliyun.com 的连通性,应使用的命令和参数是
ping -c 10

5.使用命令   (当前目录)config_(要求完整命令) 对 config 目录做归档压缩,生成 config.tar.gz 文件
tar   zcvf ./config  config.tar.gz

6.Linux系统中,使用命令(非ping)测试DNS服务器是否能够正确解析域名。
host
dig
nslookup

7.当局域网没有条件建立DNS服务器,但又想让局域网内的用户可以使用计算机名互相访问,应配置文件
/etc/hosts

8.永久改变主机名
hostnamectl set-hostname 名字

9.查看 10.0.0.1 机器上提供的网络文件 NFS 服务
showmount -e 10.0.0.1

10使用LVM 进行磁盘分区挂载
mount 
11.LVM相关命令有哪些
pvcreate
vgcreate
lvcreate

pvdisplay
vgdisplay
lvdisplay

pvscan
vgscan
lvscan

pvextend
vgextend
lvextend

pvremove
vgremove
lvremove

12.某文件的权限为:drw-r--r--,用数值形式表示该权限为: 644
该文件属性是:目录
可读不可写不可执行:属组和其他

13.某系统网卡名为eth0,在文件中配置静态网络 (包括ip、掩码、网关等)

2. shell数组

  • 变量:存储单个元素的内存空间
  • 数组:存储多个元素的连续的内存空间,相当于多个变量的集合

2.1 数组定义方法

结构
1.数组名=(value0 value1 value2…)

2.数组名=([0]=value [1]=value [2]=value…)

3.列表名="value0 value1 value2…"

  数组名=($列表名)

4.数组名[0]="value"

  数组名[1]="value"

  数组名[2]="value"
  • 第一种方法
[root@localhost ~]#a={10,20,30,40,50}
[root@localhost ~]#echo $a
{10,20,30,40,50}
[root@localhost ~]#a=(10,20,30,40,50)
[root@localhost ~]#echo $a
10,20,30,40,50
[root@localhost ~]#a=(10 20 30 40 50)
[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[*]}
10 20 30 40 50
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${#a[@]}
5
  • 第二种方法
[root@localhost ~]#b=([0]=apple [1]=grape [2]=orange [3]=strawberry [4]=banana)
[root@localhost ~]#echo $b
apple
[root@localhost ~]#echo ${b[*]}
apple grape orange strawberry banana
  • 第三种方法
[root@localhost ~]#c="10 20 30 40 50"
[root@localhost ~]#d=$c
[root@localhost ~]#echo ${d[*]}
10 20 30 40 50
[root@localhost ~]#echo ${!a[*]}
0 1 2 3 4
[root@localhost ~]#echo ${!a[@]}
0 1 2 3 4
[root@localhost ~]#for i in ${b[@]};do echo $i;done;
apple
grape
orange
strawberry
banana

2.2 数组切片

2.3 数组删除

2.4 数组替换

2.5 数组追加

2.6 普通数组

  • 普通数组可以不事先声明,直接使用
基本数组
[root@localhost ~]#vim num.sh
#!/bin/bash
a=(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll mmm nnn ooo ppp qqq rrr sss ttt uuu vvv www xxx yyy zzz)

j=`echo $[RANDOM%6]`

n=$[j+1]

echo "选中的人是$n"

echo ${a[$j]}

[root@localhost ~]#bash num.sh
选中的人是5
eee


2.7 关联数组

  • 关联数组必须先声明,再使用
关联数组
[root@localhost ~]#declare -A f   #声明关联数组
[root@localhost ~]#f[name]=tss
[root@localhost ~]#f[address]=China
[root@localhost ~]#echo ${f[name]}
tss
[root@localhost ~]#echo ${f[address]}
China

[root@localhost ~]#declare -a   #查看数组
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -ar BASH_REMATCH='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="1")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
declare -a b='([0]="apple" [1]="grape" [2]="orange" [3]="strawberry" [4]="banana")'

冒泡排序

[root@localhost ~]#vim mp.sh
#!/bin/bash
a=( 10 30 50 70 133 )
#取出上面的数组的最大值

max=${a[0]}
l=${#a[@]}

for ((i=0;i<=l;i++))
do
if [[ $max -lt ${a[$i+1]} ]]
then
max=${a[$i+1]}
fi
done

echo $max

[root@localhost ~]#bash mp.sh
133


#求最小值
[root@localhost ~]#vim min.sh
#!/bin/bash
read -p "请输入数组以空格隔开" num
a=($num)

min=${a[0]}
l=${#a[@]}

for ((i=0;i<$l-1;i++))
do
if [[ $min -ge ${a[$i+1]} ]]
then
min=${a[$i+1]}
fi
done
echo "最小值是$min"

[root@localhost ~]#bash min.sh
请输入数组以空格隔开 4 2 5 6 3
最小值是2