shell编程4 函数+数组

函数

函数介绍

函数是什么?

  函数就是存放代码的容器。

  函数内的一组代码都是为了来实现某一特定功能的,称之为一组代码块/函数体代码。

  调用函数可以直接触发函数体代码的运行

  一个函数本质就相当于实现某一特定功能的工具

为什么要用函数?

  不用函数来存放代码的问题有:

    1、代码冗余(指的是重复代码)

    2、可维护性、可扩展性很差

    3、可读性很差

如何用函数?

  先定义后调用。  

函数的定义与调用

定义函数:把实现某一功能的一段代码放在函数肚子里。

  无参函数:

    三种语法格式:

function 函数名() {  多行代码分号;分隔开,花括号左右两边都得空一格 } 

function 函数名() {  
    1
    2
    3
    ...
}
函数名() {  
    1
    2
    3
    。。。 
}
function 函数名 {  
    1
    2
    3
    。。。 
}

  有参函数:

调用函数:

    无参函数:

直接用函数名调用即可。

函数参数

定义格式和无参函数一样,只不过有参函数内部会用$1、$2、$3、...$(11)...接收传入的位置参数

调用:函数名 参数

 

$0

$# 统计位置参数的个数

$* 整体当成一个

$@ 识别数组

 

$$ 获取当前脚本的pid号

$?上一条命令的运行状态

$

函数有参还是无参,一切根据需求来。

函数的返回值

 如果把函数当做工厂:

   函数的参数就相当于给工厂传的原材料;

   函数的返回值就是工厂流水线产出的产品/结果。  

  

我们需要拿到函数的结果做二次的加工处理,那么函数就需要返回值。

如何控制函数的返回值?

  return 只用于返回函数的运行状态(真、假)

注意:

  1、函数内可以有多个return,但只要执行一次return,整个函数就会立即结束,并且把return后的值当做运行的最终状态返回。

  return后什么都不写,默认返回的状态码是0,0代表真。

       2、return返回值的返回0-255

  3、函数内没有return,那么函数运行的状态码,以函数体内最后一步执行的代码的状态码为准。

 

  用echo来输出,用$(函数名来接着)。

#!/bin/bash -

function get_mem_info() {
    mem_available=`free |awk '/Mem/{print$NF}'`
    mem_total=`free |awk '/Mem/{print$2}'`
    idle_percent=`echo "scale=2; $mem_available / $mem_total" |bc |cut -d'.' -f2`
    echo $idle_percent
}

get_mem_info
m=$(get_mem_info)
if [ $m -gt 80 ]; then
    echo "内存空间即将不足"

fi

基于函数组织程序的开发思路

  先把该有的功能都罗列出来,再写具体的(主)逻辑。

变量的作用域

  指的就是变量可以被访问到的范围。

    1、局部作用域

      含义:指的就是在函数内用local关键字声明的变量。

      特点:只能在函数内访问到,别的地方都看不到。

    2、全局作用域

      含义:在整个bash进程都能看得到,每个bash进程都有一个自己全局作用域。

      定义:直接定义的变量默认就是全局作用域范围的(包含在函数体内定义的变量,只要不加local关键字)。

      强调

    3、环境作用域(环境变量)

      定义:export 

      特点:环境变量可以传递给子子孙孙进程。

      强调:1、只能父传子,不能倒着来。2、两个没有任何关系的进程export 无效。3、export定义的变量都是临时的

    4、系统级别(指的是加到配置文件,各个地方都会加载)

      登录shell肯定会加载的文件:/etc/profile

  结合进入shell环境必须加载的那些脚本文件,将export 放到脚本文件中。实现的效果就相当于整个系统都能看得见

export name="zrg"
[root@localhost scripts]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=107
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=zh_CN.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=33
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=12324
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/scripts
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.1.38 5614 22'
SSH_CONNECTION='192.168.1.38 5614 192.168.1.87 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=53
_=env
colors=/root/.dircolors
mem_available=635948
mem_total=995700
set命令:查看所有定义过的变量
[root@localhost scripts]# env
XDG_SESSION_ID=53
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.1.38 5614 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/scripts
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.1.38 5614 192.168.1.87 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
OLDPWD=/root
env命令:查看环境变量

变量作用域访问优先级

 

  

数组

普通数组的四种定义:

array1=(111 222 333 "444 555")
[root@localhost scripts]# array1=(111 222 333 "444 555")
[root@localhost scripts]# declare -a
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
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 array1='([0]="111" [1]="222" [2]="333" [3]="444 555")'
array2=([0]=123 [2]=456)

普通数组的索引必须是数字。

array3[0]=1
array3[1]=11
array3[2]=111
array4=(`ls`)

访问数组:

echo $(array1[0])

支持负向索引:

echo $(array2[-1])

访问所有索引

echo $(array3[*])
echo $(array4[@])

获取所有元素的个数

echo $(#array4[@])

修改/添加数组元素

array1[0]=123
array2[6]=4567

不支持负向索引。

删除数组里的某个元素:

unset array3[2]

数组内元素的截取/切片

起始索引,往后取几位(包含当前位)

echo $(array4[*]:2:2)

删除某个元素

echo $(array2[*]#two)

 

关联数组

decalre -A info=(["name"]="zrg" ["age"]=18 ["career"="it"])

取值

info["career"]

 

遍历取出

直接遍历值

for item in $(array1[*])

通过key去遍历值

for k in $(!info[*])
do

    echo $k $(info[$k])

done

造索引,按照索引去遍历值

for ((i=o;i<${#array1[*]};i++))
do

    echo $i ${array1[*]}
done

*和@的区别:

#!/bin/bash -
array=(1 11 123 12 2 12 3 "333 4 444")

for item in ${array[*]}
do
    echo $item
done
~      
[root@localhost scripts]# ./11.sh
1
11
123
12
2
12
3
333
4
444
[root@localhost scripts]# cp 11.sh 12.sh
[root@localhost scripts]# vi 12.sh
#!/bin/bash -
array=(1 11 123 12 2 12 3 "333 4 444")

for item in "${array[@]}"
do
    echo $item
done
[root@localhost scripts]# chmod +x 12.sh
[root@localhost scripts]# ./12.sh
1
11
123
12
2
12
3
333 4 444

 

练习

#!/bin/bash 
array=(
    10.0.0.7
    10.0.0.8
    10.0.0.9
    10.0.0.41
)
 
for info in ${array[*]}
do
    ping -c 2 -W 1  $info
done
[root@localhost scripts]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nginx:x:997:995:nginx user:/var/cache/nginx:/sbin/nologin
www:x:1000:1000::/home/www:/bin/bash

读文件的每一行:

[root@localhost scripts]# while read line
> do
> echo $line
> done</etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nginx:x:997:995:nginx user:/var/cache/nginx:/sbin/nologin
www:x:1000:1000::/home/www:/bin/bash

 

posted @ 2025-06-24 00:20  张仁国  阅读(10)  评论(0)    收藏  举报
目录代码