• linux_shell_2_shell 中的变量特性


      我们知道,linux/unix下shell作为用户与操作系统,或者说shell作为人与计算机之间的接口,详细的了解shell所支持的各项功能,对

    用户操作系统是一件有必要的事情。这里我说一些我在使用的过程中发现的一些有意思的shell变量特性。

    一、简单变量

    1、“ 和 \ 以及  ' 的转义作用

      在linux的shell使用过程中,如果一行命令太长我们可以使用 \ 来转义Enter,从而实现续行,这延续了C语言的规范。

    Exp1:

    [volcanol@volcanol home]$ test=\
    > "this is a test"
    [volcanol@volcanol home]$ echo $test
    this is a test

      可以发现,我们成功的以\ 进行了续行的作用。

    Exp2:

    [volcanol@volcanol home]$ test="
    > "this is another test"
    > 
    [volcanol@volcanol home]$ echo $test
    this is a test

      可以发现 ”  符号虽然可以讲表示续行输入的> 提示符引出来,但是并没有真正的实现换行,而是将Enter转义了,并且不能正常的执行命令。

    Exp3:

    [volcanol@volcanol home]$ test=vol's name
    > i am a linux funs
    [volcanol@volcanol home]$ echo $test     
    this is a test
    [volcanol@volcanol home]$ test='volcanol's name'
    > this is the third test
    > 
    [volcanol@volcanol home]$ echo $test

          通过这里可以发现 ' 也不能续行,而是将enter转义了,只要存在没有配对的 ',不管 ' 后面是否有字符,均会将Enter转义掉

    Exp4:

    [volcanol@volcanol home]$ test="this is another test"
    [volcanol@volcanol home]$ echo $test
    this is another test

    Exp5:

    [volcanol@volcanol home]$ test="this is a test"
    [volcanol@volcanol home]$ echo $test
    this is a test
    [volcanol@volcanol home]$ test='volcanol'
    [volcanol@volcanol home]$ echo $test
    volcanol
    [volcanol@volcanol home]$ test='volcanol name'
    [volcanol@volcanol home]$ echo $test
    volcanol name

      通过这里可以发现,' ' 和 " " 具有相同的效果,如果要给变量赋值字符串字面值需要用这两对符号,否则出错。

    Exp6:

    test="volcanol"
    [volcanol@volcanol home]$ test=$test"'s name"
    [volcanol@volcanol home]$ echo $test
    volcanol's name
    [volcanol@volcanol home]$ unset test
    [volcanol@volcanol home]$ test='volcanol'
    [volcanol@volcanol home]$ tetst=$test'"name'
    [volcanol@volcanol home]$ echo $test
    volcanol
    test='"'
    [volcanol@volcanol home]$ echo $test
    "

      可以发现“”符号在shell里面保持了C语言中的特性,具有粘滞的特性,而''不具有粘滞的特性;并且"'"表示的是一个字符 ' 构成的字符串,'"'则表示一个 " 表示的字符串。

    这里我们发现shell中保留了,或者说沿用了很多C语言的特性。

      我们还需要注意一点" 和 ' 之间的差别。

    [volcanol@volcanol home]$ name="vb"
    [volcanol@volcanol home]$ name="$name' book"
    [volcanol@volcanol home]$ echo $name
    vb' book
    
    
    [volcanol@volcanol home]$ unset vb
    [volcanol@volcanol home]$ unset name
    [volcanol@volcanol home]$ name='vb'
    [volcanol@volcanol home]$ name='$name book'
    [volcanol@volcanol home]$ echo $name
    $name book

      可以发现,""可以保持特殊的特性,而'不会保持特殊的特性。 

    2、变量的”累加“,可以利用 : 符号实现变量的”累加“

      这里的变量的累加主要指字符串变量的累加,而不是只数值的累加。这个符号通常用来往一些具有分段意义的变量的累加过程。

    [volcanol@volcanol home]$ test=$PATH
    [volcanol@volcanol home]$ test=$test:/home/volcanol
    [volcanol@volcanol home]$ echo $test
    /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/volcanol/bin:/home/volcanol

      这里我们发现test变量通过:符号成功的将/home/volcano目录链接到$test变量中了。下面我们来看一个关于:的其他特性。

    [volcanol@volcanol home]$ test=1
    [volcanol@volcanol home]$ test=$test:2
    [volcanol@volcanol home]$ echo $test
    1:2

      这里原本是想试一下用一个整数赋值给变量,然后看用:是否会报错,: 还是将各个值连接起来了。这里有一个特性,如果要进行算术运算,则必须

    申明/定义具有数值类型的特性的变量,可以通过declare命令实现,这里暂时不介绍。

    3、不利用利用""符号实现cat(str1,str2)功能

    Exp:

    [volcanol@volcanol home]$ unset test
    [volcanol@volcanol home]$ test="/"
    [volcanol@volcanol home]$ test="$test"home
    [volcanol@volcanol home]$ echo $test
    /home
    [volcanol@volcanol home]$ test=${test}/volcanol
    [volcanol@volcanol home]$ echo $test
    /home/volcanol

      可以发现,如果不用"str1""str2"同样可以实现两个字符串的cat功能。

    4、export一个变量

      通过export变量可以使一个变量成为环境变量

    Exp:

    [volcanol@volcanol home]$ test='name'
    [volcanol@volcanol home]$ bash
    [volcanol@volcanol home]$ echo $test
    
    [volcanol@volcanol home]$ exit
    exit
    [volcanol@volcanol home]$ echo $test
    name

      可以发现如果没有用export命令将test变成环境变量则在子进程bash中test是不可见的,即不能使用的。

    [volcanol@volcanol home]$ export test
    [volcanol@volcanol home]$ bash
    [volcanol@volcanol home]$ echo $test
    name
    [volcanol@volcanol home]$ exit
    exit
    [volcanol@volcanol home]$ echo $test
    name

      可以发现通过export命令,test可以在子进程的bash中使用,具有环境变量的效果。这样后如果需要取消这个变量的,可以使用unset命令取消即可。

    5、命令中命令

      在linux的shell中,可以在命令中执行命令。就是说可以在命令1中执行命令2,并且可以讲命令2的输出作为命令1的输入使用。

    Exp:

    [volcanol@volcanol home]$ ls /`ls /`
    ls: boot: No such file or directory
    ls: dev: No such file or directory
    ls: etc: No such file or directory
    ls: home: No such file or directory
    ls: lib: No such file or directory
    ls: lost+found: No such file or directory
    ls: media: No such file or directory
    ls: misc: No such file or directory
    ls: mnt: No such file or directory
    ls: net: No such file or directory
    ls: opt: No such file or directory
    ls: perl: No such file or directory
    ls: proc: No such file or directory
    ls: root: No such file or directory
    ls: sbin: No such file or directory
    ls: selinux: No such file or directory
    ls: srv: No such file or directory
    ls: sys: No such file or directory
    ls: tmp: No such file or directory
    ls: usr: No such file or directory
    ls: var: No such file or directory
    /bin:
    arch      chown  df             ed     gettext   ipcalc    login   mount          ping6  rvi        sort   tracepath    unicode_start  zcat
    awk       cp     dmesg          egrep  grep      kbd_mode  ls      mv             ps     rview      stty   tracepath6   unicode_stop   zsh
    basename  cpio   dnsdomainname  env    gtar      kill      mail    netstat        pwd    sed        su     traceroute   unlink
    bash      csh    doexec         ex     gunzip    ksh       mkdir   nice           red    setfont    sync   traceroute6  usleep
    cat       cut    domainname     false  gzip      link      mknod   nisdomainname  rm     setserial  tar    true         vi
    chgrp     date   dumpkeys       fgrep  hostname  ln        mktemp  pgawk          rmdir  sh         tcsh   umount       view
    chmod     dd     echo           gawk   igawk     loadkeys  more    ping           rpm    sleep      touch  uname        ypdomainname

    而我们执行ls / 命令得到的结果是:

    [volcanol@volcanol home]$ ls /
    bin  boot  dev  etc  home  lib  lost+found  media  misc  mnt  net  opt  perl  proc  root  sbin  selinux  srv  sys  tmp  usr  var
    [volcanol@volcanol home]$ 

      利用 `` 对将在命令1中的命令2先执行,并且将命令2的执行结果作为命令1的输入,从而进一步执行整个命令。

    6、直接引用变量

      当中shell中直接引用变量,bash会将变量所存储的内容看出一个可执行程序来执行

    [volcanol@volcanol ~]$ mypath="vb"
    [volcanol@volcanol ~]$ $mypath
    bash: vb: command not found
    [volcanol@volcanol ~]$ 

    二、变量作用

      1、变量可以作为命令的参数

      2、变量可以简化shell的应用和编程,最主要的功能

    Exp:

    [volcanol@volcanol home]$ mypath="$HOME"
    [volcanol@volcanol home]$ 传
    [volcanol@volcanol home]$ cd $mypath
    [volcanol@volcanol ~]$ pwd
    /home/volcanol

      上面的实例为变量作为命令的参数。

    unset mypath
    [volcanol@volcanol ~]$ mypath="/bin/ls"
    [volcanol@volcanol ~]$ $mypath
    java  mysql  samba
    [volcanol@volcanol ~]$ 

      上例中,我将mypath设置为ls命令所在的绝对路径,我们可以发现利用$mypath可以正常的执行命令,因此通过这样的手动可以简化shell编程

    三、环境变量

    1、env环境变量

      通过env命令可以查看主机中所有的环境变量。

    [volcanol@volcanol ~]$ env
    HOSTNAME=volcanol
    SHELL=/bin/bash
    TERM=vt100
    HISTSIZE=1000
    SSH_CLIENT=::ffff:192.168.0.106 17854 22
    SSH_TTY=/dev/pts/0
    USER=volcanol
    LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
    PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/volcanol/bin
    MAIL=/var/spool/mail/volcanol
    PWD=/home/volcanol
    INPUTRC=/etc/inputrc
    LANG=en_US.UTF-8
    HOME=/home/volcanol
    SHLVL=2
    LOGNAME=volcanol
    SSH_CONNECTION=::ffff:192.168.0.106 17854 ::ffff:192.168.0.103 22
    LESSOPEN=|/usr/bin/lesspipe.sh %s
    G_BROKEN_FILENAMES=1
    _=/bin/env

      可以发现这里env显示的也是当前用户的环境变量。

    2、set命令

      利用set命令可以查看在shell环境下有效的变量,如果在子程序中,这里变量的值可能不一样。

    [volcanol@volcanol ~]$ set
    BASH=/bin/bash
    BASH_ARGC=()
    BASH_ARGV=()
    BASH_LINENO=()
    BASH_SOURCE=()
    BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
    BASH_VERSION='3.00.16(1)-release'
    COLORS=/etc/DIR_COLORS
    COLUMNS=168
    DIRSTACK=()
    EUID=500
    GROUPS=()
    G_BROKEN_FILENAMES=1
    HISTFILE=/home/volcanol/.bash_history
    HISTFILESIZE=1000
    HISTSIZE=1000
    HOME=/home/volcanol
    HOSTNAME=volcanol
    HOSTTYPE=i386
    IFS=$' \t\n'
    INPUTRC=/etc/inputrc
    LANG=en_US.UTF-8
    LESSOPEN='|/usr/bin/lesspipe.sh %s'
    LINES=47
    LOGNAME=volcanol
    LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:'
    MACHTYPE=i386-redhat-linux-gnu
    MAIL=/var/spool/mail/volcanol
    MAILCHECK=60
    OLDPWD=/home
    OPTERR=1
    OPTIND=1
    OSTYPE=linux-gnu
    PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/volcanol/bin
    PIPESTATUS=([0]="127")
    PPID=2911
    PS1='[\u@\h \W]\$ '
    PS2='> '
    PS4='+ '
    PWD=/home/volcanol
    SHELL=/bin/bash
    SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
    SHLVL=2
    SSH_CLIENT='::ffff:192.168.0.106 17854 22'
    SSH_CONNECTION='::ffff:192.168.0.106 17854 ::ffff:192.168.0.103 22'
    SSH_TTY=/dev/pts/0
    SUPPORTED=en_US.UTF-8:en_US:en
    TERM=vt100
    UID=500
    USER=volcanol
    _=himBH
    mypath=vb
    name='$name book'

      上图为set命令查看到的变量 ,为当前用户的shell中的有效变量。

    [volcanol@volcanol ~]$ bash
    [volcanol@volcanol ~]$ set
    BASH=/bin/bash
    BASH_ARGC=()
    BASH_ARGV=()
    BASH_LINENO=()
    BASH_SOURCE=()
    BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
    BASH_VERSION='3.00.16(1)-release'
    COLORS=/etc/DIR_COLORS
    COLUMNS=168
    DIRSTACK=()
    EUID=500
    GROUPS=()
    G_BROKEN_FILENAMES=1
    HISTFILE=/home/volcanol/.bash_history
    HISTFILESIZE=1000
    HISTSIZE=1000
    HOME=/home/volcanol
    HOSTNAME=volcanol
    HOSTTYPE=i386
    IFS=$' \t\n'
    INPUTRC=/etc/inputrc
    LANG=en_US.UTF-8
    LESSOPEN='|/usr/bin/lesspipe.sh %s'
    LINES=47
    LOGNAME=volcanol
    LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:'
    MACHTYPE=i386-redhat-linux-gnu
    MAIL=/var/spool/mail/volcanol
    MAILCHECK=60
    OPTERR=1
    OPTIND=1
    OSTYPE=linux-gnu
    PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/volcanol/bin
    PIPESTATUS=([0]="0")
    PPID=4037
    PS1='[\u@\h \W]\$ '
    PS2='> '
    PS4='+ '
    PWD=/home/volcanol
    SHELL=/bin/bash
    SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
    SHLVL=3
    SSH_CLIENT='::ffff:192.168.0.106 17854 22'
    SSH_CONNECTION='::ffff:192.168.0.106 17854 ::ffff:192.168.0.103 22'
    SSH_TTY=/dev/pts/0
    SUPPORTED=en_US.UTF-8:en_US:en
    TERM=vt100
    UID=500
    USER=volcanol
    _=/etc/bashrc
    [volcanol@volcanol ~]$ 

      上图为当前登录用户在开启另外一个shell后的shell中的有效变量。

      可以发现不是环境变量的值不能继承到子进程中。

    Tip :

      在这里有一个约定俗成的惯例,那就是大写字母的变量通常用作系统的环境变量(退出当前会话,开始新的会话,这些变量仍有效),而其他变量则是用户的变量,

    除非通过export命令,否则一般为会话变量(当前会话有效的变量)。

    3、PS1环境变量

      这个变量决定console的提示符的样式,例如我们查看一下这个变量的内容:

    [volcanol@volcanol ~]$ echo $PS1
    [\u@\h \W]\$

      可以发现$PS1是:  [\u@\h \W]\$

      这里 \u 表达当前登录用户名,

        [  ]  @  $ 字符,原样显示的字符

            \h  表示的网站主机名的第一个字段,

            \W表示当前的工作路径的最后一个目录,

    我们可以试一下修改这个环境变量的值看看:

    [volcanol@volcanol ~ 20:45 #6]$ PS1='\[\ulogin\H \w\]\$ '
    volcanolloginvolcanol ~$ PS1='[\u login \H \t \w]\>'
    [volcanol login volcanol 20:49:13 ~]\>PS1='[\u login \H and now \t \w]\>'
    [volcanol login volcanol and now 20:49:33 ~]\>

      可以发现我们成功的修改了这个变量的值,但是这个修改仅在当前会话中有效,退出后即不能有效。为了使这个修改一直有效必须修改bash的profile配置

    文件;如果要对整个系统有效则需要修改/etc/bashrc profile 文件,而对于当前用户则需要修改~/.bashrc文件;有些地方说要修改~/.bash_profile文件,其实

    两者存在一个调用关系。我们可以看~/.bash_profile的内容。

    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    PATH=$PATH:$HOME/bin
    
    export PATH
    unset USERNAME

    4、export命令

      我们可以通过整个变量来改变设置环境变量,通过export var_name可以使var_name在同一次的login会话中的不同console会话中有效, 但是logout后将不再有效。

    如果要使这个设置有效必须修改用户或者系统的profile配置文件。这里就不多说了。

      可以使用export查看当前用户的环境变量。注意这个命令查看的与set的差别。

    [volcanol@volcanol ~]$ export
    declare -x G_BROKEN_FILENAMES="1"
    declare -x HISTSIZE="1000"
    declare -x HOME="/home/volcanol"
    declare -x HOSTNAME="volcanol"
    declare -x INPUTRC="/etc/inputrc"
    declare -x LANG="en_US.UTF-8"
    declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
    declare -x LOGNAME="volcanol"
    declare -x LS_COLORS="no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:"
    declare -x MAIL="/var/spool/mail/volcanol"
    declare -x OLDPWD
    declare -x PATH="/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/volcanol/bin"
    declare -x PWD="/home/volcanol"
    declare -x SHELL="/bin/bash"
    declare -x SHLVL="1"
    declare -x SSH_CLIENT="::ffff:192.168.0.106 20999 22"
    declare -x SSH_CONNECTION="::ffff:192.168.0.106 20999 ::ffff:192.168.0.103 22"
    declare -x SSH_TTY="/dev/pts/0"
    declare -x TERM="xterm"
    declare -x USER="volcanol"

    5、语系环境变量

         可以通过locale命令查看语系环境变量。

    [volcanol@volcanol ~]$ locale
    LANG=en_US.UTF-8
    LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
    LC_ALL=

      这些变量的意思可以查看相关的手册。 值得一提的是语系的环境配置文件为/etc/sysconfig/i18n 文件,我们可以查看一下这个文件的内容。

    [volcanol@volcanol ~]$ cat /etc/sysconfig/i18n
    LANG="en_US.UTF-8"
    SYSFONT="latarcyrheb-sun16"
    SUPPORTED="en_US.UTF-8:en_US:en"
    [volcanol@volcanol ~]$

      可以看到我目前主机的字符编码是en_US.UTF-8编码格式,注意这里设置变量的格式。

    待续.......

  • 相关阅读:
    前端开发——HTML学习笔记
    前端开发——HTML学习笔记
    前端开发——HTML学习笔记
    日记2018/1/4
    物联网概念
    安卓常见英文缩写的全拼
    快速排序和计数排序API
    Hash表API
    栈/队列API(push和pop)
    链表API实现(插入,删除,查找)
  • 原文地址:https://www.cnblogs.com/volcanol/p/2535222.html
Copyright © 2020-2023  润新知