Linux-Shell变量

1. 变量的设置,读取

1.1变量的读取

  • echo读取变量
  • 变量前加$
  • 可以把变量用大括号({})包裹
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

1.2 变量的设定

  • 等号(=)设定变量的值 *等号两边不能有空格
  • 变量名称只能是英文或者数字,且数字不能在开头
  • 变量内容有空格符,需要用双引号(")或者单引号(')包裹变量内容
    • 双括号内的$可以引用其他的变量值
    • 单引号内的$作为一般字符
[root@iZwz9ayvrn26ptadymu9ymZ ~]# name=junzerg
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo "hello $name"
hello junzerg
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo 'hello $name'
hello $name
  • 反斜线(\)可以将特殊符号转化成一般字符
  • 返单引号(`),【$()】,可以引用命令执行的结果
[root@iZwz9ayvrn26ptadymu9ymZ ~]# version1=`uname -r`
[root@iZwz9ayvrn26ptadymu9ymZ ~]# version2=$(uname -r)
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo "version1:$version1;version2:$version2"
version1:3.10.0-693.2.2.el7.x86_64;version2:3.10.0-693.2.2.el7.x86_64
  • 【"$variable"】,【${variable}】可以扩增变量内容
[root@iZwz9ayvrn26ptadymu9ymZ ~]# name="$name"name
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $name
junzergname
[root@iZwz9ayvrn26ptadymu9ymZ ~]# name=${name}name
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $name
junzergnamename
  • export 命令使变量变成环境变量
  • 一般大写字符为系统变量,小写字符为自定义变量
  • unset命令取消变量

2.环境变量

2.1 evn查看环境变量

[root@iZwz9ayvrn26ptadymu9ymZ ~]# env
XDG_SESSION_ID=3100
HOSTNAME=iZwz9ayvrn26ptadymu9ymZ
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=114.93.110.210 53662 22
OLDPWD=/lib/modules/3.10.0-693.2.2.el7.x86_64
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=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=114.93.110.210 53662 172.18.207.76 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
  • HOME:用户家目录
  • SHELL:当前环境的SHELL
  • HISTORY:系统记录的历史指令数量
  • MAIL:mail命令邮件文件保存的文件夹
  • PATH:执行文件查询路径,目录与目录间用冒号(:)分隔
  • LANG:语系
  • RANDOM:随机数变量,在BASH环境中该变量范围是[0,32767]

2.2 set查看所有变量

[root@iZwz9ayvrn26ptadymu9ymZ ~]# 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=81
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=iZwz9ayvrn26ptadymu9ymZ
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=en_US.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=24
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=/lib/modules/3.10.0-693.2.2.el7.x86_64
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=18343
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root
RANDOM=5770
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='114.93.110.210 53662 22'
SSH_CONNECTION='114.93.110.210 53662 172.18.207.76 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=3100
_=env
colors=/root/.dircolors
name=junzergnamename
  • PS1:命令提示字符设定
    • \d:显示出【星期 月 日】的日期格式
    • \H :完整主机名
    • \h:取主机在第一个小数点之前的名字
    • \t :显示时间,为24小时格式的【HH:MM:SS】
    • \T:显示时间,为12小时格式的【HH:MM:SS】
    • \A:显示时间,为24小时格式的【HH:MM】
    • @:显示时间,为12小时格式的【am/pm】
    • \u:目前使用者账户名
    • \v:BASH版本信息
    • \w:完整工作目录名称,家目录以~代替
    • \W:利用basename函数取得工作目录名称,也就是最后一个目录名
    • #:下达的第几个命令
    • $:提示字符,root为#,其他为$
  • $:本shell的PID
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $$
18347
  • ?:上一个指令的执行结果,0代表成功,1-255 代表错误码
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $?
0
  • OSTYPE,HOSTTYPE,MACHTYPE:主机硬件与核心的等级
OSTYPE=linux-gnu
HOSTTYPE=x86_64
MACHTYPE=x86_64-redhat-linux-gnu

3. 语系变量

  • locale命令可以查看Linux的语系信息。
    • locale可以查看当前语系信息设定
    • locale -a查看Linux支持的所有语系
  • 系统默认的语系信息保存在/etc/sysconfig/i18n

4. 键盘读取变量

4.1 read读取来自键盘的输入

  • 命令格式:read[-pt] variable
    • -p:设置提示字符
    • -t:设置等待时间,单位秒
[root@iZwz9ayvrn26ptadymu9ymZ ~]# read rtest
123
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $rtest
123
[root@iZwz9ayvrn26ptadymu9ymZ ~]# read -p "Enter a word:" -t 10 word
Enter a word:123
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $word
123

4.2 declare / typeset

  • declare和typeset都能声明变量的类型。
  • declare命令格式:declare [-aixr] variable
    • -a:声明为数组(array)类型
    • -i:声明为整型(intger)类型
    • -x:声明为环境变量
    • -r:声明为只读(readonly),变量不能被变更,也不能unset
  • declare不带参数同set一样,列出所有变量。
  • 声明为只读的变量,只有注销重新登录新的shell才会复原
[root@iZwz9ayvrn26ptadymu9ymZ ~]# sum1=1+2+3
[root@iZwz9ayvrn26ptadymu9ymZ ~]# declare -i sum=1+2+3
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $sum1 $sum
1+2+3 6
  • 数组定义方法为:var[indent]=content
  • 数组读取方法为【${var[indent]}】
[root@iZwz9ayvrn26ptadymu9ymZ ~]# var[0]=a
[root@iZwz9ayvrn26ptadymu9ymZ ~]# var[1]=b
[root@iZwz9ayvrn26ptadymu9ymZ ~]# var[2]=c
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo "${var[0]},${var[1]},${var[2]}"
a,b,c

5. 变量内容的删除、取代、替换(Optional)

5.1 变量删除

以下为例

[root@iZwz9ayvrn26ptadymu9ymZ ~]# variable=${PATH}
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo ${variable#/*local/sbin:}
/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  • # :删除关键字
  • 删除在${}中使用
  • variable 为变量名称
  • *表示通配符,也就是说这里可以使用正则表达式 变量设定关键字如下: / |变量设定方式|说明| |:-|:-| |${变量#关键词}|若变量内容从前往后的数据符合【关键字】 则将符合的最短数据删除| |${变量##关键词}|若变量内容从前往后的数据符合【关键字】 则将符合的最长数据删除| |${变量%关键词}|若变量从后往前的数据符合【关键字】 则将符合的最长数据删除| |${变量%%关键词}|若变量从后往前的数据符合【关键字】 则将符合的最长数据删除| |${变量/旧字符串/新字符串键词}|若变量内容符合【旧字符串】 则第一个旧字符串会被新字符串代替| |${变量//旧字符串/新字符串键词}|若变量内容符合【旧字符串】 则全部的旧字符串都会被新字符串代替|

5.2 变量测试与内容替换

以下为例:减号【-】能够检测变量是否存在,如果存在值跳过,不存在则进行设定。

[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $name

[root@iZwz9ayvrn26ptadymu9ymZ ~]# name=${name-root}
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $name
root
[root@iZwz9ayvrn26ptadymu9ymZ ~]# name=junzerg
[root@iZwz9ayvrn26ptadymu9ymZ ~]# name=${name-root}
[root@iZwz9ayvrn26ptadymu9ymZ ~]# echo $name
junzerg

变量关键字说明如下:

变量设定方式

str没有设定

str为空字符串

str为非空字符串

var=${str-expr

var=expr

var=

var=$str

var=${str:-expr

var=expr

var=expr

var=$str

var=${str+expr

var=

var=expr

var=expr

var=${str:+expr

var=

var=

var=expr

var=${str=expr

str=exprvar=expr

str不变var=

str不变var=$str

var=${str:=expr

str=exprvar=expr

str=exprvar=expr

str不变var=$str

var=${str?expr

expr输出至stderr

var=expr

var=$str

var=${str:?expr

expr输出至stderr

expr输出至stderr

var=$str

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券