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/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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434146.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章带你了解C++中隐含的this指针

文章目录 一、this指针的引出二、this指针的特性【面试题】 一、this指针的引出 我们先来定义一个日期类Date&#xff0c;下面这段代码执行的结果是什么呢&#xff1f; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}v…

VMware虚拟机部署Linux Ubuntu系统

本文介绍基于VMware Workstation Pro虚拟机软件&#xff0c;配置Linux Ubuntu操作系统环境的方法。 首先&#xff0c;我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是&#xff0c;VMware Workstation Pro软件是一个收费软件&#xff0c;而互联网中有很…

6.【SpringBoot3】登录优化-redis

1. SpringBoot 集成 redis 示例 在之前实现的登录接口中&#xff0c;用户登录成功后会生成一个令牌响应给浏览器&#xff0c;之后浏览器访问其他接口时&#xff0c;都要携带该令牌&#xff0c;接受拦截器的检验&#xff0c;如果令牌有效就放行&#xff0c;允许访问后续接口&am…

SpringBoot之分页查询的使用

背景 在业务中我们在前端总是需要展示数据&#xff0c;将后端得到的数据进行分页处理&#xff0c;通过pagehelper实现动态的分页查询&#xff0c;将查询页数和分页数通过前端发送到后端&#xff0c;后端使用pagehelper&#xff0c;底层是封装threadlocal得到页数和分页数并动态…

【开源】基于JAVA+Vue+SpringBoot的用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

Procexp64.exe —— 强大的进程管理器

1&#xff0c;简介 Process Explorer 是一款增强型的任务管理器&#xff0c;你可以使用它方便地管理你的程序进程&#xff0c;能强行关闭任何程序。 除此之外&#xff0c;它还详尽地显示计算机信息&#xff1a;CPU、内存使用情况&#xff0c;DLL、句柄信息&#xff0c;很酷的…

大创项目推荐 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

科技助力“双碳”:墨水屏电子桌牌在绿色办公中的作用

随着科技的发展&#xff0c;人们对绿色环境可持续发展也越来越重视&#xff0c;所以&#xff0c;我国在几年前&#xff0c;就提出了“双碳”政策&#xff08;即碳达峰与碳中和的简称。2020年9月中国明确提出2030年“碳达峰”与2060年“碳中和”目标&#xff09;&#xff0c;而作…

使用Go语言编写安全的HTTP代理服务器

构建一个安全的HTTP代理服务器是至关重要的&#xff0c;因为这可以保护用户的数据和隐私。让我们来看看如何使用Go语言编写一个安全的HTTP代理服务器。 首先&#xff0c;确保你的代理服务器使用HTTPS协议进行通信。HTTPS使用SSL/TLS加密来保护数据传输&#xff0c;可以确保数据…

【开源】基于JAVA的学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

招商引资小程序来了!如何解决信息不对称和低效率问题?

​在经济全球化的今天&#xff0c;招商引资已经成为各地发展经济的重要手段。然而&#xff0c;传统的招商方式存在着信息不对称、效率低下等问题&#xff0c;这不仅影响了招商效果&#xff0c;也给客商带来了不小的困扰。 那么&#xff0c;有没有一种方式&#xff0c;可以有效…

【论文解读】Object Goal Navigation usingGoal-Oriented Semantic Exploration

论文&#xff1a;https://devendrachaplot.github.io/papers/semantic-exploration.pdf 代码&#xff1a;https://github.com/devendrachaplot/Object-Goal-Navigation 项目&#xff1a; Object Goal Navigation using Goal-Oriented Semantic Exploration example&#xff1…