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

原文地址:https://www.cnblogs.com/654321cc/p/9280653.html