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=expr
var=expr
str不变
var=
str不变
var=$str
var=${str:=expr str=expr
var=expr
str=expr
var=expr
str不变
var=$str
var=${str?expr expr输出至stderr var=expr var=$str
var=${str:?expr expr输出至stderr expr输出至stderr var=$str
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,110评论 2 34
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,493评论 18 399
  • [TOC] ##Assoc 显示或修改文件扩展名关联 Assoc [.Ext[=[Filetype]]] .Ex...
    btijjj阅读 320评论 0 1
  • shell编程shell主要用来简化管理操作bash变量1.什么是变量变量是计算机内存的单元,其中存放的值可以改变...
    小线亮亮阅读 1,108评论 0 1
  • 对于绝大多数人来说,买房、装修是一辈子的大事,买了新房子,很多人会想着:我一定要好好装修,装成我喜欢的风格,毕竟,...
    飞天小女警啊6阅读 148评论 0 0