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.rhkb.cn/news/246846.html

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

相关文章

Unity中的协程

这里写目录标题 前言一、 什么是协程&#xff1f;二、如何声明一个协程三、协程的作用四、协程的优缺点优点 缺点五、 应用示例延迟执行渐变效果 六、总结 前言 在学习unity的过程中会遇到“协程”的概念&#xff0c;听到协程我们脑海里应该会想到它 当然不是一个东西&#xf…

基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)

一、项目介绍 随着科技的不断发展和人们生活水平的提高&#xff0c;农业生产也逐渐向智能化、高效化的方向发展。水稻作为我国主要的粮食作物之一&#xff0c;其生长过程中的灌溉管理尤为重要。传统的灌溉方式往往依赖于人工观察和控制&#xff0c;不仅效率低下&#xff0c;而…

硬件知识(1) 手机的长焦镜头

#灵感# 手机总是配备好几个镜头&#xff0c;研究一下 目录 手机常配备的摄像头&#xff0c;及效果举例 长焦的焦距 焦距的定义和示图&#xff1a; IPC的焦距和适用场景&#xff1a; 手机常配备的摄像头&#xff0c;及效果举例 以下是小米某个手机的摄像头介绍&#xff1a…

.NET绿色开源一键自动化下载、安装、激活Office的利器

前言 今天分享一款.NET开源、绿色、安全、无毒的支持一键自动化下载、安装、激活Microsoft Office的利器&#xff1a;LKY_OfficeTools。 工具介绍 一键自动化下载、安装、激活 Microsoft Office 的利器。绿色、开源、安全、无毒。 目前包含的功能&#xff1a; 一键快速下载、…

12.Elasticsearch应用(十二)

Elasticsearch应用&#xff08;十二&#xff09; 1.单机ES面临的问题 海量数据存储问题单点故障问题 2.ES集群如何解决上面的问题 海量数据存储解决问题&#xff1a; 将索引库从逻辑上拆分为N个分片&#xff08;Shard&#xff09;&#xff0c;存储到多个节点单点故障问题&a…

FPGA HDMI IP之DDC(本质I2C协议)通道学习

目的&#xff1a; 使用KingstVIS逻辑分析仪软件分析HDMI的DDC通道传输的SCDC数据&#xff08;遵循I2C协议&#xff09;&#xff0c;同时学习了解SCDC的寄存器与I2C通信协议。 部分英文缩写&#xff1a; HDMIHigh Definition Multi-media Interface高清多媒体接口DDCDisplay Dat…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

数据结构OJ题——二叉树前序、中序遍历非递归实现(Java版)

二叉树前序、中序遍历非递归实现 前序非递归遍历实现中序非递归遍历实现 前序非递归遍历实现 题目&#xff1a; 二叉树前序遍历非递归实现 总体思路&#xff1a;用非递归的方式模拟递归遍历。 以下图为例&#xff1a; 图示详解&#xff1a; 代码实现&#xff1a; /*** Defi…

打开 IOS开发者模式

前言 需要 1、辅助设备&#xff1a;苹果电脑&#xff1b; 2、辅助应用&#xff1a;Xcode&#xff1b; 3、准备工作&#xff1a;苹果手机 使用数据线连接 苹果电脑&#xff1b; 当前系统版本 IOS 17.3 通过Xcode激活 两指同时点击 Xcode 显示选择&#xff0c;Open Develop…

【数据结构与算法】6.栈

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

Android App开发基础(1)—— App的开发特点

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

HarmonyOS 鸿蒙应用开发 (七、HTTP网络组件 axios 介绍及封装使用)

在HarmonyOS应用开发中&#xff0c;通过HTTP访问网络&#xff0c;可以使用官方提供的ohos.net.http模块。但是官方提供的直接使用不太好使用&#xff0c;需要封装下才好。推荐使用前端开发中流行的axios网络客户端库&#xff0c;如果是前端开发者&#xff0c;用 axios也会更加顺…

springboot项目开发,使用thymeleaf前端框架的简单案例

springboot项目开发,使用thymeleaf前端框架的简单案例&#xff01;我们看一下&#xff0c;如何在springboot项目里面简单的构建一个thymeleaf的前端页面。来完成动态数据的渲染效果。 第一步&#xff0c;我们在上一小节&#xff0c;已经提前预下载了对应的组件了。 如图&#x…

C++20 高级编程

文章目录 前言前奏lambda浅谈std::ref的实现浅谈is_same浅谈std::function的实现std::visit 与 std::variant 与运行时多态SFINAE类型内省标签分发 (tag dispatching)软件设计六大原则 SOLID To be continue.... 前言 C20 是C在C11 之后最大的一次语言变革, 其中引入了大量具有…

MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作

文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB参考文献 1. 容器与应用之间的关系介绍 MongoDB 的安装有时候并不是那么容易的&#xff0…

OSI七层模型 | TCP/IP模型 | 网络和操作系统的联系 | 网络通信的宏观流程

文章目录 1.OSI七层模型2.TCP/IP五层(或四层)模型3.网络通信的宏观流程3.1.同网段通信3.2.跨网段通信 1.OSI七层模型 在计算机通信诞生之初&#xff0c;不同的厂商都生产自己的设备&#xff0c;都有自己的网络通讯标准&#xff0c;导致了不同厂家之间各种协议不兼容&#xff0…

数论Leetcode204. 计数质数、Leetcode858. 镜面反射、Leetcode952. 按公因数计算最大组件大小

Leetcode204. 计数质数 题目 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 代码 class Solution:def countPrimes(self, n: int) -> int:if n < 2:return 0prime_arr [1 for _ in range(n)]prime_arr[0], prime_arr[1] 0, 0ls list()for i in…

JVM基础知识汇总篇

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-菜单管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

网络原理-初识(1)

目录 网络发展史 独立模式 网络互连 局域网LAN 广域网WAN 网络通信基础 IP地址 概念 格式 端口 概念 格式 认识协议 概念 作用 五元组 网络发展史 独立模式 独立模式:计算机之间相互独立; 网络互连 随着时代的发展,越来越需要计算机之间相互通信,共享软件和数…