shell脚本第四章函数和数组/2

一、函数

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安装成功

shell脚本第四章函数和数组/2_第1张图片

shell脚本第四章函数和数组/2_第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
 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,运维,服务器)