在编写脚本时,有些脚本需要反复使用,可以调用函数来解决
语句块定义成函数约等于定义了一个别名
函数是脚本的别名
(一)
function 函数名 {
命令序列
}
(二)
函数名(){
命令序列
}
(三)
function 函数名(){
命令序列
}
[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
[root@localhost ~]#vim func.sh
#!/bin/bash
os () {
if grep -q centos /etc/os-release
then
echo "centos"
elif grep -q ubuntu /etc/os-release
then
echo "ubuntu"
else
echo "can not support"
fi
}
os
[root@localhost ~]#bash func.sh
centos
如果想通过其他设备或其他路径进行调用,可以将写的脚本都存在一个函数的文件
[root@localhost opt]#vim test.sh
#!/bin/bash
. ~/func
[root@localhost opt]#bash test.sh
centos
[root@localhost opt]#vim ~/func
#!/bin/bash
os () {
if grep -q centos /etc/os-release
then
echo "centos"
elif grep -q ubuntu /etc/os-release
then
echo "ubuntu"
else
echo "can not support"
fi
}
color () {
red="echo -e \E[31m"
green="echo -e \E[32m"
end="\E[0m"
}
os
color
[root@localhost opt]#vim test.sh
#!/bin/bash
. ~/func
$green"Linux"安装成功$end
[root@localhost opt]#bash test.sh
centos
Linux安装成功
[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 显示空格
declare -F #查看当前已定义的函数名 |
declare -f #查看当前已定义的函数定义 |
declare -f func name #查看当前指定当前已定义的函数名 |
declare -F func name #查看当前已定义的函数名定义 |
[root@localhost ~]#declare -F
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL
declare -f __VOLNAME
declare -f __expand_tilde_by_ref
declare -f __get_cword_at_cursor_by_ref
declare -f __ltrim_colon_completions
declare -f __parse_options
declare -f __reassemble_comp_words_by_ref
declare -f _allowed_groups
declare -f _allowed_users
declare -f _available_fcoe_interfaces
declare -f _available_interfaces
declare -f _cd
declare -f _cd_devices
declare -f _command
declare -f _command_offset
declare -f _comp_iprconfig
declare -f _complete_as_root
declare -f _completion_loader
declare -f _configured_interfaces
declare -f _count_args
declare -f _cr_checksum_type
declare -f _cr_compress_type
declare -f _cr_createrepo
declare -f _cr_mergerepo
declare -f _cr_modifyrepo
declare -f _dvd_devices
declare -f _expand
declare -f _fcoeadm_options
declare -f _fcoemon_options
declare -f _filedir
declare -f _filedir_xspec
declare -f _fstypes
declare -f _get_comp_words_by_ref
declare -f _get_cword
declare -f _get_first_arg
declare -f _get_pword
declare -f _gids
declare -f _gluster_completion
declare -f _gluster_does_match
declare -f _gluster_form_list
declare -f _gluster_goto_child
declare -f _gluster_goto_end
declare -f _gluster_handle_list
declare -f _gluster_parse
declare -f _gluster_pop
declare -f _gluster_push
declare -f _gluster_throw
declare -f _have
declare -f _init_completion
declare -f _installed_modules
declare -f _ip_addresses
declare -f _ipa
declare -f _ipa_commands
declare -f _itweb-settings
declare -f _javaws
declare -f _kernel_versions
declare -f _known_hosts
declare -f _known_hosts_real
declare -f _lldpad_options
declare -f _lldptool_options
declare -f _longopt
declare -f _mac_addresses
declare -f _minimal
declare -f _modules
declare -f _ncpus
declare -f _parse_help
declare -f _parse_usage
declare -f _pci_ids
declare -f _pgids
declare -f _pids
declare -f _pnames
declare -f _policyeditor
declare -f _quote_readline_by_ref
declare -f _realcommand
declare -f _rl_enabled
declare -f _root_command
declare -f _scl
declare -f _service
declare -f _services
declare -f _shells
declare -f _signals
declare -f _split_longopt
declare -f _sysvdirs
declare -f _terms
declare -f _tilde
declare -f _uids
declare -f _upvar
declare -f _upvars
declare -f _usb_ids
declare -f _user_at_host
declare -f _usergroup
declare -f _userland
declare -f _variables
declare -f _xfunc
declare -f _xinetd_services
declare -f _yu_builddep
declare -f _yu_debug_dump
declare -f _yu_debuginfo_install
declare -f _yu_init_completion
declare -f _yu_package_cleanup
declare -f _yu_repo_graph
declare -f _yu_repo_rss
declare -f _yu_repoclosure
declare -f _yu_repodiff
declare -f _yu_repomanage
declare -f _yu_repoquery
declare -f _yu_verifytree
declare -f _yu_yumdb
declare -f _yu_yumdownloader
declare -f _yum
declare -f _yum_atgroups
declare -f _yum_baseopts
declare -f _yum_binrpmfiles
declare -f _yum_complete_baseopts
declare -f _yum_helper
declare -f _yum_list
declare -f _yum_plugins
declare -f _yum_transactions
declare -f color
declare -f command_not_found_handle
declare -f dequote
declare -f func
declare -f os
declare -f quote
declare -f quote_readline
[root@localhost ~]#declare -f
_pgids ()
{
COMPREPLY=($( compgen -W '$( command ps axo pgid= )' -- "$cur" ))
}
_pids ()
{
COMPREPLY=($( compgen -W '$( command ps axo pid= )' -- "$cur" ))
}
_pnames ()
{
COMPREPLY=($( compgen -X '' -W '$( command ps axo command= | \
sed -e "s/ .*//" -e "s:.*/::" -e "s/:$//" -e "s/^[[(-]//" \
-e "s/[])]$//" | sort -u )' -- "$cur" ))
}
_policyeditor ()
{
local cur prev opts base;
cur="${COMP_WORDS[COMP_CWORD]}";
prev="${COMP_WORDS[COMP_CWORD-1]}";
opts="-codebase -file -defaultfile -help";
COMPREPLY=($(compgen -W "${opts}" -- ${cur}));
return 0
}
[root@localhost ~]#declare -f func
func ()
{
hostname;
uname -r
}
[root@localhost ~]#declare -f os
os ()
{
if grep --color=auto -q centos /etc/os-release; then
echo "centos";
else
if grep --color=auto -q ubuntu /etc/os-release; then
echo "ubuntu";
else
echo "can not support";
fi;
fi
}
[root@localhost ~]#declare -F func
func
[root@localhost ~]#unset os
[root@localhost ~]#declare -f os
Return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
[root@localhost ~]#vim return.sh
user () {
if [ $USER = root ]
then
echo "这是管理员用户"
else
echo "这不是管理员用户"
return 1
fi
}
user
[root@localhost ~]#bash return.sh
这是管理员用户
[root@localhost ~]#bash return.sh
这是管理员用户
[root@localhost ~]#echo $?
0
[root@localhost ~]#su ghd
test.sh
[ghd@localhost root]$ su
#切换不彻底 会提示还是ghd用户
密码:
[root@localhost ~]#bash return.sh
这不是管理员用户
[root@localhost ~]#echo $?
1
函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
函数的退出状态码:
默认取决于函数中执行的最后一条命令的退出状态码;
自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0 无错误返回
return 1-255有错误返回
[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函数隐藏 最后只打印变量名
函数的变量会影响当前的变量 、
[root@localhost ~]#vim cc.sh
#!/bin/bash
h () {
echo "第一个参数是 $1 $2 $3"
}
h $1 $2 $3
#h$1表示位置变量$1 h$2表示位置变量$2 h$3表示位置变量$3
[root@localhost ~]#bash cc.sh
第一个参数是
[root@localhost ~]#bash cc.sh a b c
第一个参数是 a b c
[root@localhost ~]#bash cc.sh a b c d
第一个参数是 a b c
[root@localhost ~]#bash cc.sh a b c d e
第一个参数是 a b c
[root@localhost ~]#bash cc.sh 1 2 3 4
第一个参数是 1 2 3
#我们可以写小病毒脚本
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&
阶乘是基斯顿·卡曼1808年发明的运算符号,是数学术语,一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0和1阶的阶乘为1,自然数n的阶乘写作n(n=1×2×3×...×n);阶乘亦可以递归方式定义:0=1,1=1,2=2,n=(n-1)×n
[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
[root@localhost ~]#vim jc1.sh
fact() {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
echo $[$1 * $result]
fi
}
read -p "请输入:" n
fact $n
[root@localhost ~]#bash jc1.sh
请输入:1
1
[root@localhost ~]#bash jc1.sh
请输入:2
2
[root@localhost ~]#bash jc1.sh
请输入:3
6
[root@localhost ~]#bash jc1.sh
请输入:4
24
[root@localhost ~]#bash jc1.sh
请输入:5
120
[root@localhost ~]#vim jc.sh
#!/bin/bash
fact (){
read -p "请输入一个正整数:" num
if [ $num -eq 1 ]
then
echo 1
else
local temp=$[num-1]
local result=$fact$temp
echo $[num*result]
fi
}
fact
[root@localhost ~]#bash jc.sh
请输入一个正整数:1
1
[root@localhost ~]#bash jc.sh
请输入一个正整数:2
2
[root@localhost ~]#bash jc.sh
请输入一个正整数:3
6
[root@localhost ~]#bash jc.sh
请输入一个正整数:4
12
[root@localhost ~]#bash jc.sh
请输入一个正整数:5
20
[root@localhost ~]#vim jc2.sh
#!/bin/bash
fact(){
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
echo $[$1*`fact $[$1-1]`]
fi
}
fact $1
[root@localhost ~]#bash jc2.sh
jc2.sh: 第 3 行:[: 参数太多
^C
[root@localhost ~]#bash jc2.sh 2
2
[root@localhost ~]#bash jc2.sh 3
6
[root@localhost ~]#bash jc2.sh 5
120
[root@localhost opt]#vim nginx.sh
#!/bin/bash
cpu=`lscpu |grep "CPU(s)"|awk '{print $2}'|head -n1`
read -p "请输入安装目录(绝对路径):" dir
cd /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz -P /opt &>/dev/null
tar xf /opt/nginx-1.18.0.tar.gz &>/dev/null
cd /opt/nginx-1.18.0
yum -y install gcc gcc-c++ make pcre-devel openssl-devel zlib-devel openssl openssl-devel &>/dev/null
./configure --prefix=$dir &>/dev/null
make -j $cpu &>/dev/null
make install &>/dev/null
if [ $? -eq 0 ]
then
echo "安装成功"
else
echo "安装失败"
fi
[root@localhost opt]#bash nginx.sh
请输入安装目录(绝对路径):/opt
安装成功
[root@localhost opt]#ls
conf logs nginx-1.18.0.tar.gz nginx.sh
html nginx-1.18.0 nginx-1.18.0.tar.gz.1 sbin
数组就是具备某种相同属性的数据的集合;数组就是将全班的学生定义为一个变量,无法使用普通变量
如果将班级里的各位同学姓名存入到变量中,需要对每一个学生对应一个变量,如果有100名学生则需要100个变量,不好维护;那么我们可以只用一个变量,将所有学生都存入student变量中,将来调取其中一名学生时,需要用到编号,专业的称呼,下标数组里的东西都是有相同属性的元素;
数组对于变量的优化在于只有一个名字,减少了变量的个数
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
[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 共五个字符
[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
定义数组格式:
数组的包括数据类型
(一)一次赋值全部元素
[root@localhost ~]#a=(10 20 30 40 50)
#数组的取值 数组加下标 0 1 2 3 4
[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[0]}
10
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${a[3]}
40
[root@localhost ~]#echo ${a[4]}
50
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50
[root@localhost ~]#echo ${a[*]}
10 20 30 40 50
[root@localhost ~]#echo ${#a[*]}
5
[root@localhost ~]#echo ${!a[*]}
0 1 2 3 4
# "#和!"查看数组的长度 0 1 2 3 4 共五个字符
(二)只赋值特定元素
[root@localhost ~]#a=([0]=10 [1]=20 [2]=30)
[root@localhost ~]#echo $a
10
[root@localhost ~]#echo ${a[1]}
20
[root@localhost ~]#echo ${a[0]}
10
[root@localhost ~]#echo ${a[2]}
30
[root@localhost ~]#echo ${a[@]}
10 20 30
[root@localhost ~]#echo ${a[*]}
10 20 30
[root@localhost ~]#echo ${#a[*]}
3
(三)列表定义数组
[root@localhost ~]#a="1 2 3 4 5"
[root@localhost ~]#b=$a
[root@localhost ~]#echo $b
1 2 3 4 5
[root@localhost ~]#echo ${b[0]}
1 2 3 4 5
[root@localhost ~]#echo ${b[1]}
[root@localhost ~]#echo ${b[2]}
[root@localhost ~]#echo ${b[@]}
1 2 3 4 5
[root@localhost ~]#echo ${#b[@]}
1
(四)一次只赋值一个元素 追加或修改原来的值
[root@localhost ~]#a=(10 20 30 40 50)
[root@localhost ~]#echo $a
10
[root@localhost ~]#a[0]=60
[root@localhost ~]#echo $a
60
[root@localhost ~]#echo ${#a[@]}
5
[root@localhost ~]#a[5]=70
[root@localhost ~]#echo $a
60
[root@localhost ~]#echo ${a[5]}
70
[root@localhost ~]#echo ${#a[@]}
6
[root@localhost ~]#echo ${a[@]}
60 20 30 40 50 70
[root@localhost ~]#a[0]=10
[root@localhost ~]#echo ${a[@]}
10 20 30 40 50 70
(五)交互式定义数组
[root@localhost ~]#read -a name
>
#依次添加你所需的数组 回车保存退出
[root@localhost ~]#read -a name
wsc cxk wyb lyf
[root@localhost ~]#echo ${name[@]}
wsc cxk wyb lyf
[root@localhost ~]#echo ${#name[@]}
4
总结 | |
命令 | 含义 |
echo ${a[*]} echo ${a[@]} |
获取数据列表 |
echo ${a[k]}(k表示下标值) | 读取某下标赋值 |
echp ${#a[*]} echp ${#a[@]} echp ${!a[*]} echp ${!a[@]} |
读取下标个数 |
[root@localhost ~]#help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
Set variable values and attributes.
Declare variables and give them attributes. If no NAMEs are given,
display the attributes and values of all variables.
Options:
-f restrict action or display to function names and definitions
-F restrict display to function names only (plus line number and
source file when debugging)
-g create global variables when used in a shell function; otherwise
ignored
-p display the attributes and value of each NAME
Options which set attributes:
-a to make NAMEs indexed arrays (if supported)
-A to make NAMEs associative arrays (if supported)
-i to make NAMEs have the `integer' attribute
-l to convert NAMEs to lower case on assignment
-r to make NAMEs readonly
-t to make NAMEs have the `trace' attribute
-u to convert NAMEs to upper case on assignment
-x to make NAMEs export
Using `+' instead of `-' turns off the given attribute.
Variables with the integer attribute have arithmetic evaluation (see
the `let' command) performed when the variable is assigned a value.
When used in a function, `declare' makes NAMEs local, as with the `local'
command. The `-g' option suppresses this behavior.
Exit Status:
Returns success unless an invalid option is supplied or an error occurs.
[root@localhost ~]#declare -a
#declare 可以查看定义的数组
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -ar BASH_REMATCH='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a a='([0]="10" [1]="20" [2]="30" [3]="40" [4]="50")'
[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
[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
[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
[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
[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
陈伟霆
[root@localhost ~]#vim /opt/name.txt
蔡徐坤
王一博
周深
何炅
张杰
陈伟霆
谢霆锋
刘德华
[root@localhost ~]#vim sjdm.sh
#!/bin/bash
namefile="/opt/name.txt"
linenum=$(sed -n '$=' $namefile)
while :
do
clear
tmp=$(sed -n "$[RANDOM%linenum+1]p" $namefile)
echo -e "\033[32m 随机点名(Ctrl+C停止操作): \033[0m"
echo -e "\033[32m################################\033[0m"
echo -e "\033[32m# #\033[0m"
echo -e "\033[32m $tmp \033[0m"
echo -e "\033[32m# #\033[0m"
echo -e "\033[32m################################\033[0m"
sleep 0.5
done
[root@localhost ~]#bash sjdm.sh
随机点名(Ctrl+C停止操作):
################################
# #
谢霆锋
# #
################################
^C
[root@localhost ~]#vim maxmin.sh
#!/bin/bash
read -p "请输入数组值,以空格隔开:" num
a=( $num )
l=${#a[@]}
max=${a[0]}
for (( i=0;i<$l;i++ ))
do
if [[ $max -lt ${a[$i+1]} ]]
then
max=${a[$i+1]}
fi
done
echo $max
[root@localhost ~]#bash maxmin.sh
请输入数组值,以空格隔开:20 30 60 40 80 70
80
[root@localhost ~]#vim min.sh
#!/bin/bash
read -p "请输入数组值,以空格隔开:" num
a=( $num )
l=${#a[@]}
min=${a[0]}
for (( i=0;i<$l;i++ ))
do
if [[ $min -gt ${a[$i-1]} ]]
then
min=${a[$i-1]}
fi
done
echo $min
[root@localhost ~]#bash min.sh
请输入数组值,以空格隔开:20 10 60 50 30
10
[root@localhost ~]#bash min.sh
请输入数组值,以空格隔开:60 80 20 40 10
10
[root@localhost ~]#vim maxandmin.sh
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
[ $i -eq 0 ] && min=${a[0]} && max=${a[0]}
[ ${a[$i]} -gt $max ] && max=${a[$i]}
[ ${a[$i]} -lt $min ] && min=${a[$i]}
done
echo ${a[@]}
echo max=$max
echo min=$min
[root@localhost ~]#bash maxandmin.sh
28335 25487 23389 17729 14569 356 31805 7308 11396 11488
max=31805
min=356
[root@localhost ~]#bash maxandmin.sh
23054 29360 6964 29585 17012 25008 8820 6135 4051 29474
max=29585
min=4051
[root@localhost ~]#bash maxandmin.sh
502 18154 12463 14949 21490 29589 27871 13873 25657 537
max=29589
min=502
[root@localhost ~]#vim mp.sh
#!/bin/bash
for i in {0..9}
do
a[$i]=$RANDOM
done
l=${#a[@]}
for ((i=1;i