Shell脚本编程基础之shell脚本变量

变量

变量表示内存空间中存放的数据

变量的类型

  • 内置变量
  • 自定义变量

变量的数据类型

  • 字符:
  • 数值:整型,浮点型(bash不支持)

Shell中变量命名法则

  • 变量名大写
  • 局部变量小写
  • 函数名小写
  • 只能使用数字字母和下划线,且不能以数字开头
  • 不能使用程序中的保留字和内部变量
  • 简洁明了,见名知意,体现实际用途
  • 使用简写要明确简写没有歧义
  • 统一命名规则(驼峰命名法:大驼峰JustDoIt 小驼峰justDoit)

变量的定义和引用

变量的生效范围

  • 普通变量: 当前进程
  • 环境变量: 当前shell进程及子进程
  • 本地变量: 某段代码片段,通常指函数

变量的赋值

使用=进行变量赋值

  • 直接字串:name='root'
  • 引用变量:name="$LANG" ## 引用变量赋值临时生效
  • 引用命令:name=COMMAND或者name=$(COMMAND)
    随着脚本的结束,脚本中定义的变量就没了
[06:49:42 root@C8-3-55 ~]#COLOR="33[1;33m";END="33[0m"
[06:55:50 root@C8-3-55 ~]#echo -e "${COLOR}Hello WorldEND! $END"
Hello WorldEND!

查看系统变量

[07:35:53 root@C8-3-55 ~]#set | less
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactiv
e_comments:login_shell:progcomp:promptvars:sourcepath
BASHRCSOURCED=Y
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="7")
BASH_LINENO=()
BASH_REMATCH=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="19" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.4.19(1)-release'
……

环境变量

子进程

运行一个程序会生成一个进程,如果这个程序再生成程序,则被称作这个程序的子进程

  • 使用pstree显示当前系统中的进程树
[08:03:06 root@C8-3-55 ~]#pstree -p | head -n 10
systemd(1)-+-NetworkManager(966)-+-{NetworkManager}(973)
           |                     `-{NetworkManager}(975)
           |-VGAuthService(894)
           |-agetty(1015)
           |-atd(1003)
           |-auditd(865)-+-sedispatch(867)
           |             |-{auditd}(866)
           |             `-{auditd}(868)
           |-chronyd(906)
           |-crond(1010)

默认变量只在当前变量中生效


[08:03:35 root@C8-3-55 ~]#pstree -p | grep bash
           |-sshd(977)-+-sshd(2039)---sshd(2057)-+-bash(2060)-+-grep(43599)
           |           |                         `-bash(2063)---sleep(43597)
[08:05:25 root@C8-3-55 ~]#echo $BASHPID
2060
  • 使用命令printenv显示当前环境变量
[08:06:19 root@C8-3-55 ~]#printenv
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:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=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:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=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:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=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:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36:
SSH_CONNECTION=10.0.0.1 6372 10.0.0.55 22
LANG=en_US.utf8
HISTCONTROL=ignoredups
DISPLAY=localhost:10.0
HISTTIMEFORMAT=%F %T root
HOSTNAME=C8-3-55
XDG_SESSION_ID=1
USER=root
SELINUX_ROLE_REQUESTED=
PWD=/root
HOME=/root
SSH_CLIENT=10.0.0.1 6372 22
SELINUX_LEVEL_REQUESTED=
SSH_TTY=/dev/pts/0
MAIL=/var/spool/mail/root
TERM=xterm
SHELL=/bin/bash
SELINUX_USE_CURRENT_RANGE=
SHLVL=1
LOGNAME=root
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
XDG_RUNTIME_DIR=/run/user/0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
HISTSIZE=1000
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/usr/bin/printenv

set命令包含了printenv中的环境变量

只读变量

只能声明定义,不能修改,即:常量

固定值,常用默认值均可以钉子为不变的常量

常量定义后不能随便修改和删除

[08:16:03 root@C8-3-55 ~]#readonly BeiJing=010
[08:16:29 root@C8-3-55 ~]#echo BeiJing
BeiJing
[08:16:39 root@C8-3-55 ~]#echo $BeiJing
010
[08:16:44 root@C8-3-55 ~]#unset BeiJing 020
-bash: unset: BeiJing: cannot unset: readonly variable
-bash: unset: `020': not a valid identifier
[08:16:58 root@C8-3-55 ~]#BeiJing=020
-bash: BeiJing: readonly variable

退出当前进程后,临时定义的常量会被清除

[08:17:58 root@C8-3-55 ~]#echo $ BeiJing
$ BeiJing
  • 使用readonly查看系统中已定义的常量
[08:18:11 root@C8-3-55 ~]#readonly
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -ar BASH_REMATCH=()
declare -ar BASH_VERSINFO=([0]="4" [1]="4" [2]="19" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
declare -ir EUID="0"
declare -ir PPID="48077"
declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
declare -ir UID="0"
* * * 胖并快乐着的死肥宅 * * *
原文地址:https://www.cnblogs.com/bpzblog/p/14514291.html