• shell变量


    一 变量的分类

      1 环境变量

        1 )什么是环境变量

        例如你执行 ls 这个命令时,系统会通过PATH这个变量里面的内容所记录的路径顺序来查找命令。如果在PATH变量内的路径还找不到 ls 这个命令,就会在屏幕显示‘command not found’ 的错误信息。

        在linux下,所有的执行都是需要一个执行码。就如同上面提到的,你真正以 shell 来跟 linux 通信,是在正确的登录 linux 之后。这个时候你就有一个 bash  的执行程序,也才可以真正的经由 bash 来跟系统通信。而在进入 shell 之前,也正如上面提到的,由于系统需要一些变量来提供它数据的访问(或者是一些环境的设置参数值,例如是否要显示彩色等等),所以就有一些所谓的‘环境变量’需要来读入系统中。除了PATH,还有HOME,MAIL,SHELL等。环境变量通常以大写字符来表示。

        2)环境变量的功能

          查看环境变量:env

    [root@iz2ze5xd9ppdog0cch5vs0z mail]# env 
    XDG_SESSION_ID=4094
    HOSTNAME=iz2ze5xd9ppdog0cch5vs0z
    HARDWARE_PLATFORM=x86_64
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=111.196.244.62 18286 22
    OLDPWD=/var/spool
    SSH_TTY=/dev/pts/1
    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:/usr/local/python3/bin:/root/bin
    PWD=/var/spool/mail
    LANG=en_US.UTF-8
    HISTCONTROL=ignoredups
    SHLVL=1
    HOME=/root
    LOGNAME=root
    XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
    SSH_CONNECTION=111.196.244.62 18286 172.17.253.169 22
    LESSOPEN=||/usr/bin/lesspipe.sh %s
    XDG_RUNTIME_DIR=/run/user/0
    _=/usr/bin/env

          

          环境变量的使用

    [root@iz2ze5xd9ppdog0cch5vs0z mail]# cd $HOME
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# pwd
    /root

        说明:

          $ 本身也是个变量。这个代表的是目前这个 shell 的线程代号,即所谓的 PID。

    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $$
    20155

          ?也是一个特殊的变量。这个变量是上一次执行的命令所回传的值。如果一个命令成功执行,就会回传 0 。如果执行失败,则会回传一个非0。

    [root@iz2ze5xd9ppdog0cch5vs0z ~]# eech $?
    bash: eech: command not found...
    ^[[A^C
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $?
    130
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $?
    0

      2 自定义变量

    二 变量的显示与设置

      1 变量的显示:echo

      变量前面必须加上字符 ‘$’

    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $MAIL
    /var/spool/mail/root
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo ${MAIL}
    /var/spool/mail/root
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo ${PATH}
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/root/bin
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python3/bin:/root/bin

      2 变量的设置

      变量未赋值之前为空

    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $name
    
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# name=zuo
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $name
    zuo

      3 变量的设置规则

        1)双引号内的特殊字符如 $ 等,可以保有原本的特性。

              单引号内的特殊字符则仅为一般字符,即纯文本。

          即双引号仍然可以保有变量的内容。

    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $name
    zuo
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# var="my name is $name"
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $var
    my name is zuo
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# var1='my name is $name'
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $var1
    my name is $name

        2)变量名只能是英文字母或数字,但开头字符不能是数字

        3)变量名与变量内容以一个等号 ‘=’ 来连接。

        4)若该变量为了增加变量内容时,则可用 "$变量名" 或 ${变量} 累加内容,如下所示:

          PATH="$PATH":/home/bin

        5)若该变量需要在其它子进程执行,则需要以 export 来是变量变成 环境变量

          export PATH

        6)取消变量的方法为使用 "unset变量名称"

        7)可以用反单引号 ` 命令 ` 或 $(命令)  。` ` 之内的命令会先被执行,其执行出来的结果将作为外部的输入信息。

    [root@iz2ze5xd9ppdog0cch5vs0z mail]# version=`uname -r`
    [root@iz2ze5xd9ppdog0cch5vs0z mail]# echo $version
    3.10.0-693.2.2.el7.x86_64

    三 变量的键盘读取 read 与声明declare 

      1 read [ -pt ]  variable

        参数 

          -p:接提示符

          -t:等待的秒数

      示例:

    [root@iz2ze5xd9ppdog0cch5vs0z ~]# read atest
    xxx
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $atest
    xxx
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# read -p 'please input atest1:' atest1 
    please input atest1:yyy
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $atest1
    yyy

      2 declare  [ -aixr ]  variable

        参数

          -a:数组类型 array

          -i:整数类型 integer

          -x:与export一样,将变量设为环境变量

          -r:将变量设为readonly。该变量不可被更改内容,也不能重设。

        示例1 :

    [root@iz2ze5xd9ppdog0cch5vs0z ~]# sum=100+50
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $sum
    100+50
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# declare -i sum=100+50
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $sum
    150

      

    [root@iz2ze5xd9ppdog0cch5vs0z ~]# declare -i a=1/3
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# echo $a
    0

        原因:在默认的情况下,变量类型默认为‘字符串’,所以如果不指定变量类型,100+50,为一个“字符串”,而不是 ‘“计算式”

           bash环境中的数值运算,默认做多仅能达到整数类型

        示例2 :

    [root@iz2ze5xd9ppdog0cch5vs0z ~]# export | grep sum
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# declare -x sum
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# export | grep sum
    declare -ix sum="150"
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# declare +x sum
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# export | grep sum

        原因:-x 将变量设置为环境变量

           将 - 变为 + ,取消环境变量。

    四 变量内容的删除,替代与替换

      ${变量名#xxx}

      ${变量名##xxx}

      ${变量名%xxx}

      ${变量名%%xxx}

      ${变量名/xxx/XXX}

      ${变量名//xxx//XXX}

    五 数据流重定向

      stdin:代码0,使用  < 或 <<

      stdout:代码为1 ,使用 >(覆盖) 或 >>(累加)

    [root@iz2ze5xd9ppdog0cch5vs0z ~]# ls > ~/etcfile
    [root@iz2ze5xd9ppdog0cch5vs0z ~]# ls
    code  dump.rdb  etcfile  y  y.pub

      stderr:代码为2,使用 2>(覆盖) 或 2>>(累加)

      黑洞设备  /dev/null ,将stderr 放在这里

    xxx 2> /dev/null

      注意:

        如果将正确与错误数据写入同一个文件。

    ls &> ~/etcfile

    六 管道命令(pipe)

      管道命令仅能处理经由前面一个命令传来的正确信息,也就是stdout的信息,对应stderr并没有处理能力。

      在每个管道后面接的第一个数据必定是“命令”,而且这个命令必须要能够接受stdin的数据才行,这样的命令才是“管道命令”。比如less,more,heda,tail,而ls,cp,mv就不是管道命令。

      1 选取命令

        cut

        grep 

          https://www.cnblogs.com/654321cc/p/9281061.html

      2 排序命令

        sort  

        wc

        uniq

      3 双向重定向

        tee

      4 字符转换命令

        tr

        col

        join

        paste

        expand

      5 切割命令

        split

      6 参数代换

        xargs

  • 相关阅读:
    JAVA中的注解小结
    终结任务
    共享资源访问
    基本线程机制
    HashSet、LinkedHashSet、TreeSet
    EnumMap
    LinkedHashMap及其源码分析
    集合迭代器快速失败行为及CopyOnWriteArrayList
    LinkedList
    比特币中的Base58 编码
  • 原文地址:https://www.cnblogs.com/654321cc/p/9280653.html
Copyright © 2020-2023  润新知