目录
一、函数
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.使用函数
- 定义函数
- 调用函数
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/bashos () {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安装成功
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 '<defunct>' -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; thenecho "centos";elseif grep --color=auto -q ubuntu /etc/os-release; thenecho "ubuntu";elseecho "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.shuser () {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/bashh () {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.shfact() {if [ $1 -eq 1 ]thenecho 1elselocal 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 "请输入安装目录(绝对路径):" dircd /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/nullif [ $? -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 andsource file when debugging)-g create global variables when used in a shell function; otherwiseignored-p display the attributes and value of each NAMEOptions 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 exportUsing `+' instead of `-' turns off the given attribute.Variables with the integer attribute have arithmetic evaluation (seethe `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 :
docleartmp=$(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++ ))
doif [[ $max -lt ${a[$i+1]} ]]thenmax=${a[$i+1]}fi
doneecho $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++ ))
doif [[ $min -gt ${a[$i-1]} ]]thenmin=${a[$i-1]}fi
doneecho $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/bashfor i in {0..9}
doa[$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]}
doneecho ${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/bashfor i in {0..9}
doa[$i]=$RANDOM
donel=${#a[@]}
for ((i=1;i<l;i++))
dofor ((j=0;j<l-i;j++))dofirst=${a[$j]}k=$[j+1]second=${a[$k]}if [[ $first -gt $second ]]thentemp=$firsta[$j]=$seconda[$k]=$tempfidone
doneecho ${a[@]}[root@localhost ~]#bash mp.sh
1877 6662 7036 7793 11094 12757 15373 19456 20390 28156
[root@localhost ~]#bash mp.sh
2424 5447 5751 6373 11460 15339 19273 26420 28943 32668
[root@localhost ~]#bash mp.sh
6172 6403 10755 15465 17979 18599 19699 20251 30309 32465
[root@localhost ~]#bash mp.sh
989 1302 8520 9499 11478 15959 19350 22273 22295 32183