Linux系统——函数与数组

目录

一、函数

1.函数的定义

2.使用函数

3.定义函数的方法

4.函数举例

4.1判断操作系统

4.2判断ip地址

5.查看函数列表

6.删除函数

7.函数返回值——Return

8.函数的作用范围

9.函数传参

10.函数递归

10.1病毒

10.2阶乘

10.2.1 用for循环

10.2.2函数阶乘

10.3一键编译安装nginx

二、数组

1.概念

2.作用

3.数组名和索引

3.1普通索引——定义普通数组可以不申明直接使用(declare -a 数组名)

3.2关联索引——定义关联数组一定要先申明(declare -A 数组名)

4.定义数组

4.1定义数组 普通索引

5.数组遍历

6.数组切片——截取想得到的数组内容

7.数组替换——只是定义上的替换 并非真正替换

8.数组删除

9.实验

9.1点名

9.1.1点名

 9.1.2随机点名

 9.2取数组中最大值和最小值

9.2.1取最大值

9.2.2取最小值

9.2.3随机数字比大小

9.3冒泡排序


 

一、函数

1.函数的定义

在编写脚本时,有些脚本需要反复使用,可以调用函数来解决

语句块定义成函数约等于定义了一个别名

函数是脚本的别名

2.使用函数

  1. 定义函数
  2. 调用函数

3.定义函数的方法

(一)
function 函数名 {
         命令序列
}

(二)
函数名(){
      命令序列
}

(三)
function 函数名(){
        命令序列
}
  • 直接写 函数中调用函数 直接写函数名
  • 同名函数 后一个函数生效
  • 调用函数一定要先定义
  • 每个函数是独立的
  • 函数名尽量不可以重复  不能是已有的命令(ls、cd、cut等等)

4.函数举例

[root@localhost ~]#func (){ hostname;uname -r; }
[root@localhost ~]#func
localhost.localdomain
3.10.0-693.el7.x86_64
[root@localhost ~]#vim func.sh
[root@localhost ~]#bash func.sh 
hello
[root@localhost ~]#bash func.sh 
hello

4.1判断操作系统

[root@localhost ~]#vim func.sh

#!/bin/bash
os () {

if grep -q centos /etc/os-release
then
echo "centos"
elif  grep -q ubuntu /etc/os-release
then
echo "ubuntu"
else
echo "can not support"
fi

}

os


[root@localhost ~]#bash func.sh 
centos

如果想通过其他设备或其他路径进行调用,可以将写的脚本都存在一个函数的文件

[root@localhost opt]#vim test.sh

#!/bin/bash


. ~/func

[root@localhost opt]#bash test.sh 
centos
[root@localhost opt]#vim ~/func

#!/bin/bash

os () {

if grep -q centos /etc/os-release
then
echo "centos"
elif  grep -q ubuntu /etc/os-release
then
echo "ubuntu"
else
echo "can not support"
fi
}

color () {
red="echo -e \E[31m"
green="echo -e \E[32m"
end="\E[0m"
}

os
color


[root@localhost opt]#vim test.sh 

#!/bin/bash


. ~/func

$green"Linux"安装成功$end

[root@localhost opt]#bash test.sh 
centos
Linux安装成功

Linux系统——函数与数组_第1张图片

Linux系统——函数与数组_第2张图片

4.2判断ip地址

[root@localhost ~]#vim ip.sh 

ip () {

read -p "请输入一个ip地址:"  host
[[ "$host"  =~  ^([0-9]{1,3}\.){3}[0-9]{1,3}$  ]] ||  { echo "$host ip地址是非
法的";return 1; }
}


[root@localhost ~]#. ip.sh 
[root@localhost ~]#ip
请输入一个ip地址:192.168.91.100
[root@localhost ~]#bash ip.sh 
[root@localhost ~]#ip
请输入一个ip地址:192.168.241.11
[root@localhost ~]#ip
请输入一个ip地址:192.168.11111

set list 显示空格 

5.查看函数列表

declare -F

#查看当前已定义的函数名

declare -f

#查看当前已定义的函数定义

declare -f func name

#查看当前指定当前已定义的函数名

declare -F func name

#查看当前已定义的函数名定义

[root@localhost ~]#declare -F
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
declare -f __VOLNAME
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __ltrim_colon_completions
declare -f __parse_options
declare -f __reassemble_comp_words_by_ref
declare -f _allowed_groups
declare -f _allowed_users
declare -f _available_fcoe_interfaces
declare -f _available_interfaces
declare -f _cd
declare -f _cd_devices
declare -f _command
declare -f _command_offset
declare -f _comp_iprconfig
declare -f _complete_as_root
declare -f _completion_loader
declare -f _configured_interfaces
declare -f _count_args
declare -f _cr_checksum_type
declare -f _cr_compress_type
declare -f _cr_createrepo
declare -f _cr_mergerepo
declare -f _cr_modifyrepo
declare -f _dvd_devices
declare -f _expand
declare -f _fcoeadm_options
declare -f _fcoemon_options
declare -f _filedir
declare -f _filedir_xspec
declare -f _fstypes
declare -f _get_comp_words_by_ref
declare -f _get_cword
declare -f _get_first_arg
declare -f _get_pword
declare -f _gids
declare -f _gluster_completion
declare -f _gluster_does_match
declare -f _gluster_form_list
declare -f _gluster_goto_child
declare -f _gluster_goto_end
declare -f _gluster_handle_list
declare -f _gluster_parse
declare -f _gluster_pop
declare -f _gluster_push
declare -f _gluster_throw
declare -f _have
declare -f _init_completion
declare -f _installed_modules
declare -f _ip_addresses
declare -f _ipa
declare -f _ipa_commands
declare -f _itweb-settings
declare -f _javaws
declare -f _kernel_versions
declare -f _known_hosts
declare -f _known_hosts_real
declare -f _lldpad_options
declare -f _lldptool_options
declare -f _longopt
declare -f _mac_addresses
declare -f _minimal
declare -f _modules
declare -f _ncpus
declare -f _parse_help
declare -f _parse_usage
declare -f _pci_ids
declare -f _pgids
declare -f _pids
declare -f _pnames
declare -f _policyeditor
declare -f _quote_readline_by_ref
declare -f _realcommand
declare -f _rl_enabled
declare -f _root_command
declare -f _scl
declare -f _service
declare -f _services
declare -f _shells
declare -f _signals
declare -f _split_longopt
declare -f _sysvdirs
declare -f _terms
declare -f _tilde
declare -f _uids
declare -f _upvar
declare -f _upvars
declare -f _usb_ids
declare -f _user_at_host
declare -f _usergroup
declare -f _userland
declare -f _variables
declare -f _xfunc
declare -f _xinetd_services
declare -f _yu_builddep
declare -f _yu_debug_dump
declare -f _yu_debuginfo_install
declare -f _yu_init_completion
declare -f _yu_package_cleanup
declare -f _yu_repo_graph
declare -f _yu_repo_rss
declare -f _yu_repoclosure
declare -f _yu_repodiff
declare -f _yu_repomanage
declare -f _yu_repoquery
declare -f _yu_verifytree
declare -f _yu_yumdb
declare -f _yu_yumdownloader
declare -f _yum
declare -f _yum_atgroups
declare -f _yum_baseopts
declare -f _yum_binrpmfiles
declare -f _yum_complete_baseopts
declare -f _yum_helper
declare -f _yum_list
declare -f _yum_plugins
declare -f _yum_transactions
declare -f color
declare -f command_not_found_handle
declare -f dequote
declare -f func
declare -f os
declare -f quote
declare -f quote_readline
[root@localhost ~]#declare -f


_pgids () 
{ 
    COMPREPLY=($( compgen -W '$( command ps axo pgid= )' -- "$cur" ))
}
_pids () 
{ 
    COMPREPLY=($( compgen -W '$( command ps axo pid= )' -- "$cur" ))
}
_pnames () 
{ 
    COMPREPLY=($( compgen -X '' -W '$( command ps axo command= | \
        sed -e "s/ .*//" -e "s:.*/::" -e "s/:$//" -e "s/^[[(-]//" \
            -e "s/[])]$//" | sort -u )' -- "$cur" ))
}
_policyeditor () 
{ 
    local cur prev opts base;
    cur="${COMP_WORDS[COMP_CWORD]}";
    prev="${COMP_WORDS[COMP_CWORD-1]}";
    opts="-codebase -file -defaultfile -help";
    COMPREPLY=($(compgen -W "${opts}" -- ${cur}));
    return 0
}
[root@localhost ~]#declare -f func 
func () 
{ 
    hostname;
    uname -r
}


[root@localhost ~]#declare -f os
os () 
{ 
    if grep --color=auto -q centos /etc/os-release; then
        echo "centos";
    else
        if grep --color=auto -q ubuntu /etc/os-release; then
            echo "ubuntu";
        else
            echo "can not support";
        fi;
    fi
}
[root@localhost ~]#declare -F func 
func

6.删除函数

[root@localhost ~]#unset os

[root@localhost ~]#declare -f os

7.函数返回值——Return

Return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值

[root@localhost ~]#vim return.sh

user () {

if  [ $USER = root ] 
then
echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi
}

user

[root@localhost ~]#bash return.sh 
这是管理员用户
[root@localhost ~]#bash return.sh 
这是管理员用户
[root@localhost ~]#echo $?
0
[root@localhost ~]#su ghd
test.sh
[ghd@localhost root]$ su
#切换不彻底   会提示还是ghd用户
密码:
[root@localhost ~]#bash return.sh 
这不是管理员用户
[root@localhost ~]#echo $?
1

函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;

函数的退出状态码:

默认取决于函数中执行的最后一条命令的退出状态码;

自定义退出状态码,其格式为:

return 从函数中返回,用最后状态命令决定返回值

return 0 无错误返回

return 1-255有错误返回

8.函数的作用范围

  • 函数在Shell脚本中仅在当前Shell环境中有效
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令
[root@localhost ~]#vim hello.sh 

#!/bin/bash
h () {
echo "hello"
}
nihao () {
echo `h` `w`
}

w () {
echo "world"
}

nihao

[root@localhost ~]#. hello.sh 
hello world
[root@localhost ~]#h
hello
[root@localhost ~]#w
world
[root@localhost ~]#name=cxk
[root@localhost ~]#func() { name=wsc;echo $name; }
[root@localhost ~]#func
wsc
[root@localhost ~]#echo $name 
wsc
[root@localhost ~]#name=cxk;func() { local name=wsc;echo $name; };echo $name
cxk
#local将变量限制在函数内   也就是把func函数隐藏  最后只打印变量名

函数的变量会影响当前的变量 

9.函数传参

[root@localhost ~]#vim cc.sh

#!/bin/bash

h () {

echo "第一个参数是 $1 $2 $3"

}

h $1 $2 $3
#h$1表示位置变量$1   h$2表示位置变量$2  h$3表示位置变量$3

[root@localhost ~]#bash cc.sh 
第一个参数是   
[root@localhost ~]#bash cc.sh a b c
第一个参数是 a b c
[root@localhost ~]#bash cc.sh a b c d
第一个参数是 a b c
[root@localhost ~]#bash cc.sh a b c d e 
第一个参数是 a b c
[root@localhost ~]#bash cc.sh 1 2 3 4
第一个参数是 1 2 3

10.函数递归

  • 函数调用自己本身的函数
  • 必须要有结束函数的语句,防止死循环

10.1病毒

#我们可以写小病毒脚本
func () { echo $i;echo "run fast";let i++;func; }


func1 ()  { echo "run fast";i=0;let i++;echo $i ;func1; }
[fork炸弹]
fork 炸弹是一种恶意程序,它的内部是一个不断在 fork 进程的无限循环,实质是一个简单的递归程
序。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源
参考:https://en.wikipedia.org/wiki/Fork_bomb
:(){ :|:& };:
#:就是一个字符 可以写成单词
bomb() { bomb | bomb & }; bomb

脚本实现
#!/bin/bash
./$0|./$0&

10.2阶乘

阶乘是基斯顿·卡曼1808年发明的运算符号,是数学术语,一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0和1阶的阶乘为1,自然数n的阶乘写作n(n=1×2×3×...×n);阶乘亦可以递归方式定义:0=1,1=1,2=2,n=(n-1)×n

10.2.1 用for循环
[root@localhost ~]#vim jc.sh

#!/bin/bash
sum=1
read -p "请输入一个正整数:" num
for i in `seq $num`
do
let sum=$[i*sum]
done
echo $sum

[root@localhost ~]#bash jc.sh 
请输入一个正整数:1
1
[root@localhost ~]#bash jc.sh 
请输入一个正整数:2
2
[root@localhost ~]#bash jc.sh
请输入一个正整数:4
24
[root@localhost ~]#bash jc.sh
请输入一个正整数:5
120
10.2.2函数阶乘
[root@localhost ~]#vim jc1.sh

fact() {
  if [ $1 -eq 1 ]
  then
    echo 1
  else
   local temp=$[$1 - 1]
   local result=$(fact $temp)
   echo $[$1 * $result]
	
  fi
}
read -p "请输入:" n
fact $n

[root@localhost ~]#bash jc1.sh 
请输入:1
1
[root@localhost ~]#bash jc1.sh 
请输入:2
2
[root@localhost ~]#bash jc1.sh 
请输入:3
6
[root@localhost ~]#bash jc1.sh 
请输入:4
24
[root@localhost ~]#bash jc1.sh 
请输入:5
120
[root@localhost ~]#vim jc.sh 

#!/bin/bash
fact (){
read -p "请输入一个正整数:"  num
if [ $num -eq 1 ]
then
echo 1
else
local temp=$[num-1]
local result=$fact$temp
echo $[num*result]
fi
}

fact

[root@localhost ~]#bash jc.sh 
请输入一个正整数:1
1
[root@localhost ~]#bash jc.sh 
请输入一个正整数:2
2
[root@localhost ~]#bash jc.sh 
请输入一个正整数:3
6
[root@localhost ~]#bash jc.sh 
请输入一个正整数:4
12
[root@localhost ~]#bash jc.sh 
请输入一个正整数:5
20
[root@localhost ~]#vim jc2.sh

#!/bin/bash
fact(){
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
echo $[$1*`fact $[$1-1]`]
fi
}
fact $1

[root@localhost ~]#bash jc2.sh 
jc2.sh: 第 3 行:[: 参数太多
^C
[root@localhost ~]#bash jc2.sh 2
2
[root@localhost ~]#bash jc2.sh 3
6
[root@localhost ~]#bash jc2.sh 5
120

10.3一键编译安装nginx

[root@localhost opt]#vim nginx.sh

#!/bin/bash
cpu=`lscpu |grep "CPU(s)"|awk '{print $2}'|head -n1`
read -p "请输入安装目录(绝对路径):"   dir

cd /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz -P /opt &>/dev/null
tar xf /opt/nginx-1.18.0.tar.gz &>/dev/null
cd /opt/nginx-1.18.0
yum -y install gcc  gcc-c++ make  pcre-devel openssl-devel zlib-devel openssl openssl-devel &>/dev/null
./configure  --prefix=$dir &>/dev/null
make -j $cpu &>/dev/null
make install &>/dev/null

if [ $? -eq 0 ]
then
echo "安装成功"
else
echo "安装失败"
fi


[root@localhost opt]#bash nginx.sh 
请输入安装目录(绝对路径):/opt
安装成功
[root@localhost opt]#ls
conf  logs          nginx-1.18.0.tar.gz    nginx.sh
html  nginx-1.18.0  nginx-1.18.0.tar.gz.1  sbin

二、数组

1.概念

数组就是具备某种相同属性的数据的集合;数组就是将全班的学生定义为一个变量,无法使用普通变量

如果将班级里的各位同学姓名存入到变量中,需要对每一个学生对应一个变量,如果有100名学生则需要100个变量,不好维护;那么我们可以只用一个变量,将所有学生都存入student变量中,将来调取其中一名学生时,需要用到编号,专业的称呼,下标数组里的东西都是有相同属性的元素;

数组对于变量的优化在于只有一个名字,减少了变量的个数

2.作用

  • 方便查找
  • 方便有序的存放

变量:存储单个元素的内存空间

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

3.数组名和索引

  • 索引的编号默认从0开始,属于数值索引
  • 索引可支持使用自定义的格式,而不仅仅是数值格式,即为关联索引
  • bash的数组支持稀疏格式(索引不连续  可以定义数组为0和10)

3.1普通索引——定义普通数组可以不申明直接使用(declare -a 数组名)

[root@localhost ~]#a=(10 20 30 40 50)
[root@localhost ~]#declare -a a
#数组的取值 数组加下标  0  1  2  3  4

[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[0]}
10
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${a[3]}
40
[root@localhost ~]#echo ${a[4]}
50
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#echo ${a[*]}
10 20 30 40 50
[root@localhost ~]#echo ${#a[*]}
5
#查看数组的长度  0 1 2 3 4 共五个字符

3.2关联索引——定义关联数组一定要先申明(declare -A 数组名)

[root@localhost ~]#declare -A F
[root@localhost ~]#F[name]=Frenk
[root@localhost ~]#echo $F
[root@localhost ~]#echo ${F[name]}
Frenk
[root@localhost ~]#F[name]=Frank
[root@localhost ~]#echo ${F[name]}
Frank


#不提前声明没有效果
[root@localhost ~]#b[name]=Bob
[root@localhost ~]#echo ${b[name]}
Bob
[root@localhost ~]#b[d]=100
[root@localhost ~]#echo ${b[name]}
100


[root@localhost ~]#declare -A smith
[root@localhost ~]#smith[people]=3
[root@localhost ~]#smith[address]=USA
[root@localhost ~]#smith[mail]=163.com
[root@localhost ~]#echo ${smith[people]}
3
[root@localhost ~]#echo ${smith[address]}
USA
[root@localhost ~]#echo ${smith[mail]}
163.com

4.定义数组

定义数组格式

  • 数组名=(value0 value1 value2 value3 ...)  一次赋值全部元素
  • 数组名= ([0]=value [1]=value1 [2]=value2 ...)  只赋值特定元素
  • 列表名= "value0 value1 value2 value3 ...";数组名= ($列表名)
  • 数组名[0]="value1";数组名[1]="value2";数组名[2]="value3"   一次只赋值一个元素

数组的包括数据类型

  • 数值型
  • 字符型
  • 混合型数值加字符

4.1定义数组 普通索引

(一)一次赋值全部元素

[root@localhost ~]#a=(10 20 30 40 50)

#数组的取值 数组加下标  0  1  2  3  4

[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[0]}
10
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${a[3]}
40
[root@localhost ~]#echo ${a[4]}
50
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#echo ${a[*]}
10 20 30 40 50
[root@localhost ~]#echo ${#a[*]}
5
[root@localhost ~]#echo ${!a[*]}
0 1 2 3 4
#   "#和!"查看数组的长度  0 1 2 3 4 共五个字符




(二)只赋值特定元素
[root@localhost ~]#a=([0]=10 [1]=20 [2]=30)
[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[0]}
10
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${a[@]}
10 20 30
[root@localhost ~]#echo ${a[*]}
10 20 30
[root@localhost ~]#echo ${#a[*]}
3



(三)列表定义数组
[root@localhost ~]#a="1 2 3 4 5"
[root@localhost ~]#b=$a
[root@localhost ~]#echo $b
1 2 3 4 5
[root@localhost ~]#echo ${b[0]}
1 2 3 4 5
[root@localhost ~]#echo ${b[1]}

[root@localhost ~]#echo ${b[2]}

[root@localhost ~]#echo ${b[@]}
1 2 3 4 5
[root@localhost ~]#echo ${#b[@]}
1




(四)一次只赋值一个元素   追加或修改原来的值
[root@localhost ~]#a=(10 20 30 40 50)
[root@localhost ~]#echo $a
10
[root@localhost ~]#a[0]=60
[root@localhost ~]#echo $a
60
[root@localhost ~]#echo ${#a[@]}
5
[root@localhost ~]#a[5]=70
[root@localhost ~]#echo $a
60
[root@localhost ~]#echo ${a[5]}
70
[root@localhost ~]#echo ${#a[@]}
6
[root@localhost ~]#echo ${a[@]}
60 20 30 40 50 70
[root@localhost ~]#a[0]=10
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50 70


(五)交互式定义数组
[root@localhost ~]#read -a name
>
#依次添加你所需的数组  回车保存退出
[root@localhost ~]#read -a name
wsc cxk wyb lyf
[root@localhost ~]#echo ${name[@]}
wsc cxk wyb lyf
[root@localhost ~]#echo ${#name[@]}
4
总结
命令 含义

echo ${a[*]}

echo ${a[@]}

获取数据列表
echo ${a[k]}(k表示下标值) 读取某下标赋值

echp ${#a[*]}

echp ${#a[@]}

echp ${!a[*]}

echp ${!a[@]}

读取下标个数

 

[root@localhost ~]#help declare 
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.
    
    Declare variables and give them attributes.  If no NAMEs are given,
    display the attributes and values of all variables.
    
    Options:
      -f	restrict action or display to function names and definitions
      -F	restrict display to function names only (plus line number and
    	source file when debugging)
      -g	create global variables when used in a shell function; otherwise
    	ignored
      -p	display the attributes and value of each NAME
    
    Options which set attributes:
      -a	to make NAMEs indexed arrays (if supported)
      -A	to make NAMEs associative arrays (if supported)
      -i	to make NAMEs have the `integer' attribute
      -l	to convert NAMEs to lower case on assignment
      -r	to make NAMEs readonly
      -t	to make NAMEs have the `trace' attribute
      -u	to convert NAMEs to upper case on assignment
      -x	to make NAMEs export
    
    Using `+' instead of `-' turns off the given attribute.
    
    Variables with the integer attribute have arithmetic evaluation (see
    the `let' command) performed when the variable is assigned a value.
    
    When used in a function, `declare' makes NAMEs local, as with the `local'
    command.  The `-g' option suppresses this behavior.
    
    Exit Status:
    Returns success unless an invalid option is supplied or an error occurs.
[root@localhost ~]#declare -a
#declare  可以查看定义的数组
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]="0")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'

5.数组遍历

[root@localhost ~]#vim szbl.sh

#!/bin/bash
a=(10 20 30 40 50)
for i in ${a[@]}
do
echo i=$i
done

[root@localhost ~]#bash szbl.sh 
i=10
i=20
i=30
i=40
i=50

6.数组切片——截取想得到的数组内容

[root@localhost ~]#a=(10 20 30 40 50 60 70)
#                      0  1  2  3  4  5  6 
[root@localhost ~]#echo ${a[@]:3}
#从第3位开始显示
40 50 60 70
[root@localhost ~]#echo ${a[@]:3:1}
#从第3位开始显示,取第一个,也就是第3位本身
40
[root@localhost ~]#echo ${a[@]:3:2}
#从第3位开始显示,取第一个,也就是第3位本身和第4位
40 50
[root@localhost ~]#echo ${a[@]:3:3}
#从第3位开始显示,取第一个,也就是第3位本身和第4位、第五位
40 50 60

7.数组替换——只是定义上的替换 并非真正替换

[root@localhost ~]#a=(10 20 30 40 50 60 70)
#                      0  1  2  3  4  5  6
[root@localhost ~]#echo ${a[@]:3}
#显示数组第三位开始后面的量
40 50 60 70
[root@localhost ~]#echo ${a[@]/40/66}
#将数组的第3位  名义上修改为66
10 20 30 66 50 60 70
[root@localhost ~]#echo ${a[@]}
#实际并未修改数组真正的量
10 20 30 40 50 60 70
[root@localhost ~]#echo ${a[3]}
#数组第3位依旧是40
40
[root@localhost ~]#a[3]=66
#为数组变量进行赋值  是对数组内的量进行修改
[root@localhost ~]#echo ${a[@]}
#此时可以看到数组内第3位的量确实被修改为66
10 20 30 66 50 60 70

8.数组删除

[root@localhost ~]#a[3]=66
[root@localhost ~]#echo ${a[@]}
#承接上文 数组第3位的值为66
10 20 30 66 50 60 70
[root@localhost ~]#unset a[3]=66
#删除赋值数组
[root@localhost ~]#echo ${a[@]}
#赋值数组已删除
10 20 30 50 60 70
[root@localhost ~]#echo ${!a[@]}
#赋值数组长度已删除
0 1 2 4 5 6
[root@localhost ~]#a[3]=40
#重新为第3位数组进行赋值
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50 60 70
[root@localhost ~]#echo ${!a[@]}
0 1 2 3 4 5 6

9.实验

9.1点名

9.1.1点名
[root@localhost ~]#vim dm.sh 

#!/bin/bash
a=( 王一博 蔡徐坤 李易峰 陈伟霆 )
num=`echo $[RANDOM%4]`

echo ${a[$num]}

[root@localhost ~]#bash dm.sh 
王一博
[root@localhost ~]#bash dm.sh 
李易峰
[root@localhost ~]#bash dm.sh 
李易峰
[root@localhost ~]#bash dm.sh 
王一博
[root@localhost ~]#bash dm.sh 
蔡徐坤
[root@localhost ~]#bash dm.sh 
李易峰
[root@localhost ~]#bash dm.sh 
李易峰
[root@localhost ~]#bash dm.sh 
王一博
[root@localhost ~]#bash dm.sh 
李易峰
[root@localhost ~]#bash dm.sh 
陈伟霆
 9.1.2随机点名
[root@localhost ~]#vim /opt/name.txt

蔡徐坤
王一博
周深
何炅
张杰
陈伟霆
谢霆锋
刘德华

[root@localhost ~]#vim sjdm.sh 

#!/bin/bash
namefile="/opt/name.txt"
linenum=$(sed -n '$=' $namefile)
while :
do
 clear
 tmp=$(sed -n "$[RANDOM%linenum+1]p" $namefile)
 echo -e "\033[32m    随机点名(Ctrl+C停止操作):   \033[0m"
 echo -e "\033[32m################################\033[0m"
 echo -e "\033[32m#                              #\033[0m"
 echo -e "\033[32m            $tmp                \033[0m"
 echo -e "\033[32m#                              #\033[0m"
 echo -e "\033[32m################################\033[0m"
sleep 0.5
done



[root@localhost ~]#bash sjdm.sh 

    随机点名(Ctrl+C停止操作):   
################################
#                              #
            谢霆锋                
#                              #
################################
^C

Linux系统——函数与数组_第3张图片

 9.2取数组中最大值和最小值

9.2.1取最大值
[root@localhost ~]#vim maxmin.sh 

#!/bin/bash
read -p "请输入数组值,以空格隔开:" num
a=( $num )
l=${#a[@]}
max=${a[0]}
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 maxmin.sh 
请输入数组值,以空格隔开:20 30 60 40 80 70
80
9.2.2取最小值
[root@localhost ~]#vim min.sh

#!/bin/bash
read -p "请输入数组值,以空格隔开:" num
a=( $num )
l=${#a[@]}
min=${a[0]}
for (( i=0;i<$l;i++ ))
do
  if [[ $min -gt ${a[$i-1]} ]]
  then
  min=${a[$i-1]}


  fi
done

echo $min

[root@localhost ~]#bash min.sh 
请输入数组值,以空格隔开:20 10 60 50 30
10
[root@localhost ~]#bash min.sh 
请输入数组值,以空格隔开:60 80 20 40 10
10
9.2.3随机数字比大小
[root@localhost ~]#vim maxandmin.sh

#!/bin/bash

for i in {0..9}
do
  a[$i]=$RANDOM
  [ $i -eq 0 ]  && min=${a[0]} && max=${a[0]}
  [ ${a[$i]}  -gt       $max ] && max=${a[$i]}
  [ ${a[$i]}  -lt       $min ] && min=${a[$i]}
done

echo ${a[@]}
echo max=$max
echo min=$min


[root@localhost ~]#bash maxandmin.sh 
28335 25487 23389 17729 14569 356 31805 7308 11396 11488
max=31805
min=356
[root@localhost ~]#bash maxandmin.sh 
23054 29360 6964 29585 17012 25008 8820 6135 4051 29474
max=29585
min=4051
[root@localhost ~]#bash maxandmin.sh 
502 18154 12463 14949 21490 29589 27871 13873 25657 537
max=29589
min=502

9.3冒泡排序

[root@localhost ~]#vim mp.sh

#!/bin/bash

for i in {0..9}
do
  a[$i]=$RANDOM
done

l=${#a[@]}
for ((i=1;i

你可能感兴趣的:(linux,运维,服务器)