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
[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
变量作用域访问优先级

数组
普通数组的四种定义:
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

浙公网安备 33010602011771号