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.mzph.cn/news/651294.shtml

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

相关文章

Python实战项目Excel拆分与合并——合并篇

在实际工作中&#xff0c;我们经常会遇到各种表格的拆分与合并的情况。如果只是少量表&#xff0c;手动操作还算可行&#xff0c;但是如果是几十上百张表&#xff0c;最好使用Python编程进行自动化处理。下面介绍两种拆分案例场景&#xff0c;如何用Pandas实现Excel文件的合并。…

ELK日志解决方案

ELK日志解决方案 ELK套件日志系统应该是Elasticsearch使用最广泛的场景之一了&#xff0c;Elasticsearch支持海量数据的存储和查询&#xff0c;特别适合日志搜索场景。广泛使用的ELK套件(Elasticsearch、Logstash、Kibana)是日志系统最经典的案例&#xff0c;使用Logstash和Be…

Scikit-learn (sklearn)速通 -【莫凡Python学习笔记】

视频教程链接&#xff1a;【莫烦Python】Scikit-learn (sklearn) 优雅地学会机器学习 视频教程代码 scikit-learn官网 莫烦官网学习链接 本人matplotlib、numpy、pandas笔记 1 为什么学习 Scikit learn 也简称 sklearn, 是机器学习领域当中最知名的 python 模块之一. Sk…

burp靶场--WebSockets安全漏洞

burp靶场–WebSockets安全漏洞 https://portswigger.net/web-security/websockets/what-are-websockets ### 什么是 WebSocket&#xff1f; WebSocket是一种通过 HTTP 发起的双向、全双工通信协议。它们通常在现代 Web 应用程序中用于流数据和其他异步流量。 在本节中&#x…

ChatGPT 官方中文页面上线

根据页面显示&#xff0c;OpenAI 现已推出 ChatGPT 的多语言功能 Alpha 版测试&#xff0c;允许用户选择不同语言的界面进行交互。 如下图所示&#xff0c;ChatGPT 会检测系统当前所使用的语言&#xff0c;并提示用户进行语言切换。 用户也可通过设置页面选择其他语言。目前&a…

Linux之系统安全与应用

Linux系统提供了多种机制来确保用户账号的正当&#xff0c;安全使用。 系统安全措施 一. 清理系统账号 1.1 将用户设置为无法登录 Linux系统中除手动创建的各种账号外&#xff0c;还包括随系统或程序安装过程而生成的其他大量账号。除了超级用户root以外&#xff0c;其他的…

免费开源的微信小程序源码、小游戏源码精选70套!

微信小程序已经成为我们日常的一部分了&#xff0c;也基本是每个程序员都会涉及的内容&#xff0c;今天给大家分享从网络收集的70个小程序源码。其中这些源码包含&#xff1a;小游戏到商城小程序&#xff0c;再到实用的工具小程序&#xff0c;以及那些令人惊叹的防各大站点的小…

【Linux】文件描述符 | 重定向 | C文件指针与fd的关系 | 用户级缓冲区

文章目录 一、文件描述符1. 理解&#xff1a;Linux下一切皆文件2. 文件描述符&#xff08;fd&#xff09;的概念3. 文件描述符的分配规则4. 进程创建时默认打开的 0 & 1 & 2 号文件 二、重定向1. 重定向的本质2. 使用dup2系统调用函数3. bash下的三种重定向4. 三种重定…

全面理解“张量”概念

1. 多重视角看“张量” 张量&#xff08;Tensor&#xff09;是一个多维数组的概念&#xff0c;在不同的学科领域中有不同的应用和解释&#xff1a; 物理学中的张量&#xff1a; 在物理学中&#xff0c;张量是一个几何对象&#xff0c;用来表示在不同坐标系下变换具有特定规律的…

(N-141)基于springboot,vue网上拍卖平台

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plusredi…

GNS3连接Vmware虚拟机

1 安装配置Gns3、Vmware 安装过程略&#xff0c;最终版本号&#xff1a; Gns3&#xff1a;2.2.44.1 Vmware&#xff1a;17.0 建议保持一致&#xff0c;特别是Gns3&#xff0c;功能虽然强大的&#xff0c;但bug问题感觉也不少 2 虚拟机配置 新建两台Ubuntu 22.04虚拟机&#…

【JavaScript权威指南第七版】读书笔记速度

JavaScript权威指南第七版 序正文前言&#xff1a;图中笔记重点知识第1章 JavaScript简介第一章总结 第2章 词法结构注释字面量标识符和保留字Unicode可选的分号第二章总结 第3章 类型、值和变量【重要】原始类型特殊类型第三章总结 第4章 表达式与操作符表达式操作符条件式调用…

【JAVA面试精选篇-初生牛犊不怕虎】

文章目录 🌽 简介🧺 线程池🌄 Redis⏰ JVM🚛 数据结构🍎 Mysql🍡 结语🌽 简介 海阔凭鱼跃,天高任鸟飞! 学习不要盲目,让大脑舒服的方式吸收知识!!! 本人马上离开济南,回泰安发展,为了积极准备面试,目前在梳理一些知识点,同时希望能够帮助到需要的人… …

Rabbitmq调用FeignClient接口失败

文章目录 一、框架及逻辑介绍1.背景服务介绍2.问题逻辑介绍 二、代码1.A服务2.B服务3.C服务 三、解决思路1.确认B调用C服务接口是否能正常调通2.确认B服务是否能正常调用A服务3.确认消息能否正常消费4.总结 四、修改代码验证1.B服务异步调用C服务接口——失败2.将消费消息放到C…

智能AI系统开发,专业软件硬件物联网开发公司,探索未来科技新纪元

在信息时代&#xff0c;人工智能&#xff08;AI&#xff09;、物联网等前沿技术日益受到人们的关注。智能AI系统、专业软件硬件物联网开发公司应运而生。今天&#xff0c;我们将向大家介绍一家位于XX城的专业公司&#xff0c;致力于智能AI系统开发和软件硬件物联网领域的创新研…

大数据安全 | 期末复习(下)

文章目录 &#x1f4da;安全策略和攻击&#x1f34b;&#x1f407;安全协议&#x1f407;IPsee&#x1f407;SSL&#x1f407;SSH&#x1f407;S/MIME协议&#x1f407;公钥基础设施PKI&#x1f407;PGP&#x1f407;HTTPS&#x1f407;防火墙&#x1f407;防毒墙&#x1f407;…

解决:‘chromedriver’ executable needs to be in PATH

解决&#xff1a;chromedriver’ executable needs to be in PATH 文章目录 解决&#xff1a;chromedriver’ executable needs to be in PATH背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff1a;检查python安装路径有没有添加到环境变量里面方法二&#xff1…

谷歌vue插件安装包

链接&#xff1a;https://pan.baidu.com/s/1wTCqn7ttc-rF_wZScfEgPw?pwde7k6 提取码&#xff1a;e7k6 修改D:\谷歌浏览器插件安装包\devtools-main\packages\shell-chrome下manifest.json文件 将里面这四个文件地址改为src下面&#xff0c;因为地址在src下&#xff0c;直接…

基于Guava布隆过滤器的海量字符串高效去重实践

在Java环境中处理海量字符串去重的问题时&#xff0c;布隆过滤器&#xff08;BloomFilter&#xff09;是一种非常高效的数据结构&#xff0c;尽管它有一定的误报率。布隆过滤器适用于那些可以接受一定误报率&#xff0c;并且希望节省空间和时间成本的场景。 布隆过滤器应用 使…

Fastjson代码审计实战

代码审计-漏洞复现 漏洞分析采用的是华夏ERP2.3&#xff0c; 查看pom.xml文件发现fastjson版本1.2.55&#xff0c;该版本存在漏洞&#xff0c;利用DNSlog进行验证。 fastjson涉及反序列化的方法有两种&#xff0c;JSON.parseObject()和JSON.parse()&#xff0c;在代码中直接搜…