每天一个新知识之LInux的Bash

一、Bash的模式

set -o emacs
##切到emacs模式
set -o vi
##切到vi模式
set -o
## 查看当前选项的设置状态
allexport      	off
braceexpand    	on
emacs          	on
errexit        	off
errtrace       	off
functrace      	off
hashall        	on
histexpand     	on
history        	on
ignoreeof      	off
interactive-comments	on
keyword        	off
monitor        	on
noclobber      	off
noexec         	off
noglob         	off
nolog          	off
notify         	off
nounset        	off
onecmd         	off
physical       	off
pipefail       	off
posix          	off
privileged     	off
verbose        	off
vi             	off

二、Bash常用快捷键

快捷键快捷键说明
CTRL-A将光标移到行首(在命令行下)
CTRL-B退格 (非破坏性的),这个只是将光标位置往回移动一个位置。
CTRL-C中断,终结一个前台作业。
CTRL-D“EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。
CTRL-E将光标移动到行尾(在命令行下)
CTRL-F将光标向前移动一个字符(在命令行下)
CTRL-GBEL。在一些老式打印机终端上,这会引发一个响铃。在xterm终端上可能是哔的一声。
CTRL-H擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。
CTRL-I水平制表符。
CTRL-J新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘/012′)或十六进制形式(‘/x0a’)。
CTRL-K垂直制表符(Vertical tab)。在控制台或 xterm 窗口输入文本时,CTRL-K会删除从光标所在处到行尾的所有字符。在脚本中,也可能表示为八进制形式(‘/013′)或十六进制形式(‘/x0b’)。在脚本中,CTRL-K可能会有不一样的行为,下面的例子给出其不一样的行为:#!/bin/bash ## 一个CTRL-K垂直制表符的例子 var=$'/x0aBottom Line/x0bTop line/x0a' ## 直接输出 echo "$var" ## 使用col来过滤控制字符 echo "$var" | col ## 上面的显示将会不一样 exit 0
CTRL-L跳纸,换页(Formfeed),清屏。清空终端屏幕。在终端上,这个命令的作用和clear命令一样。但当这个命令发送到打印机时,Ctrl-L会直接跳到纸张(Paper sheet)的末尾。
CTRL-M回车(Carriage return)。
CTRL-N擦除从history缓冲区召回的一行文本(在命令行下)。如果当前输入是历史记录中选择的时候,这个是从这个历史记录开始,每按一次,是更接近的一条命令。
CTRL-O产生一个新行(在命令行下)。
CTRL-P从history缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL-N都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N是从起点开始由远及近(如果起点是历史命令的话)。
CTRL-QResume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S。
CTRL-R回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。
CTRL-SSuspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL-Q。
CTRL-T交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var;,假设光标在a上,那么,按下C-T之后,v和a将会交换位置:echo $avr;。
CTRL-U擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入。
CTRL-V在输入文本的时候,按下C-V之后,可以插入控制字符。比如:echo -e '/x0a’;和echo ;这两种效果一样。这点功能在文本编辑器内非常有效。
CTRL-W当在控制台或一个xterm窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里, CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符。
CTRL-X在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中。
CTRL-Y将之前已经清除的文本粘贴回来(主要针对CTRL-U或CTRL-W)。
CTRL-Z暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。
CTRL-/退出。和CTRL-C差不多,也可能dump一个”core”文件到你的工作目录下(这个文件可能对你没用)。
CTRL-/撤消操作,Undo。
CTRL-_撤消操作。
CTRL-xx在行首和光标两个位置间进行切换,此处是两个”x”字符。
ALT-B光标往回跳一个词,词以非字母为界(跳动到当前光标所在词的开头)。
ALT-F光标往前跳一个词(移动到光标所在词的末尾)。
ALT-D删除光标所在位置到光标所在词的结尾位置的所有内容(如果光标是在词开头,则删除整个词)。
ALT-BASKSPACE删除光标所在位置到词开头的所有内容。
ALT-C将光标所在位置的字母转为大写(如果光标在一个词的起始位置或之前,则词首字母大写)。
ALT-U将光标所在位置到词尾的所有字母转为大写。
ALT-L将光标位置到词尾的所有字母转为小写。
ALT-R取消所有变更,并将当前行恢复到在历史记录中的原始状态(前提是当前命令是从历史记录中来的,如果是手动输入,则会清空行)。
ALT-T当光标两侧都存在词的时候,交换光标两侧词的位置。如:abc bcd -> bcd abc
ALT-.使用前一次命令的最后一个词(命令本身也是一个词,参见后一篇的Bang命令中的词指示符概念)。
ALT-_同ALT-.。
ALT-数值这个数值可以是正或者是负,这个键单独没有作用,必须后面再接其他内容,如果后面是字符,则表示重复次数。如:[ALT-10,k]则光标位置会插入10个k字符(负值在这种情况下无效);如果后面接的是命令,则数字会影响后面命令的执行结果,如:[ALT–10,CTRL-D]则向CTRL-D默认方向相反(负数)的方向执行10次操作。
ALT-<移动到历史记录中的第一行命令。
ALT->移动到历史的最后一行,即当前正在输入的行(没有输入的情况下为空)。
ALT-P从当前行开始向前搜索,有必要则向”上”移动,移动时,使用非增量搜索查找用户提供的字符串。
ALT-N从当前行开始向后搜索,如果有必要向”下”移动,移动时,使用非增量搜索查找用户提供的字符串。
ALT-CTRL-Y在标志点上插入前一个命令的第一个参数(一般是前一行的第二个词)。如果有参数n,则插入前一个命令的第n个词(前一行的词编号从0开始,见历史扩展)。负的参数将插入冲前一个命令的结尾开始的第n个词。参数n通过M-No.的方式传递,如:[ALT-0,ALT-CTRL-Y]插入前一个命令的第0个词(命令本身)。
ALT-Y轮询到删除环,并复制新的顶端文本。只能在yank[CTRL-Y]或者yank-pop[M-Y]之后使用这个命令。
ALT-?列出能够补全标志点前的条目。
ALT-*把能够补全[ALT-?]命令能生成的所有文本条目插入到标志点前。
ALT-/试图对标志点前的文本进行文件名补全。[CTRL-X,/]把标志点前的文本当成文件名并列出可以补全的条目。
ALT-~把标志点前的文本当成用户名并试图进行补全。[CTRL-X,~]列出可以作为用户名补全标志点前的条目。
ALT-$把标志点前的文本当成Shell变量并试图进行补全。[CTRL-X,$]列出可以作为变量补全标志点前的条目。
ALT-@把标志点前的文本当成主机名并试图进行补全。[CTRL-X,@]列出可以作为主机补全标志点前的条目。
ALT-!把标志点前的文本当成命令名并试图进行补全。进行命令名补全时会依次使用别名、保留字、Shell函数、shell内部命令,最后是可执行文件名。[CTRL-X,!]把标志点前的文本当成命令名并列出可补全的条目。
ALT-TAB把标志点前的文本与历史记录中的文本进行比较以寻找匹配的并试图进行补全。
ALT-{进行文件名补全,把可以补全的条目列表放在大括号之间,让shell可以使用。

三、Bash的标准输入输出

设备设备文件名文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出

四、Bash的输入输出重定向

1、输出重定向

类型符号作用
标准正确(错误)输出重定向命令>文件以覆盖的方式把正确(错误)命令的输出输出到指定的文件或设备中。
标准正确(错误)输出重定向命令>>文件以追加的方式把正确(错误)命令的输出输出到指定的文件或设备中。
正确和错误输出同时保存命令>文件 2>&1以覆盖的方式把正确和错误命令的输出输出到指定的文件或设备中。
正确和错误输出同时保存命令>文件 2>>&1以追加的方式把正确和错误命令的输出输出到指定的文件或设备中。
正确和错误输出同时保存命令 &>文件以覆盖的方式把正确和错误命令的输出输出到指定的文件或设备中。
正确和错误输出同时保存命令 &>>文件以追加的方式把正确和错误命令的输出输出到指定的文件或设备中。
正确和错误输出同时保存命令>>文件1 2>>文件2把正确的输出追加到文件1,把错误的输出追加到文件2

2、输入重定向

wc命令

利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

wc [选项] [文件名]
-c	统计字节数
-w	统计单词书
-l	统计行数

五、多命令的顺序执行

多命令执行符格式作用
命令1;命令2多个命令顺序执行,命令之间没无逻辑关系
&&命令1 && 命令2当命令1正确执行时命令2才会执行
||命令1||命令2当命令1执行不正确时命令2才会执行

六、管道符

命令格式:命令1|命令2,即命令1的正确输出作为命令2的操作对象 。

#查询本地所有网络连接,提取包含'ESTABLISHED'(已建立连接的行)
[root@localhost ~]# netstat -an |grep 'ESTABLISHED'	
tcp        0      0 10.10.19.6:22               10.10.19.88:50857           ESTABLISHED 
tcp        0     64 10.10.19.6:22               10.10.19.88:63076           ESTABLISHED 
[root@localhost ~]# 
#使用wc统计行数
[root@localhost ~]# netstat -an |grep 'ESTABLISHED' | wc -l
2

七、Bash中的通配符和特殊符号

通配符作用
匹配任意一个字符
*匹配0个或者多个任意字符
[]匹配括号中任意一个字符,例如[abcde],可以匹配a、b、c、d、任意一个字符
[a-z]-代表一个范围,括号中的范围为a-z匹配改范围内任意一个字符
[^0-9]^逻辑非,标识匹配不是括号内的任意一个字符
符号作用
’ ’单引号,在单引号内的特殊符号都没有特殊含义
“ ”双引号,在单引号内的特殊符号都没有特殊含义,但是$、· 、\例外。
· ·反引号,反引号括起来的内容是系统命令,在Bash中会先执行,和 ( ) 作 用 一 直 , 不 过 推 荐 使 用 ()作用一直,不过推荐使用 ()使()
$()和反引号的作用一样用来引用系统命令
()用于一串命令的执行,()中的命令会在子shell中执行
{}用于一串命令执行时,{}中的命令会在当前shell执行,也可以用于变量变形与替换
[]用于变量测试
#注释
$用于调用变量的值,例如$a
\转义字符

八、Bash的变量和运算符

1、变量的定义规则

  • 变量名可以有字母、数字、下划线组成,但是不能以数组开头
  • 在Bash中,变量的默认类型都是字符串,如果要进行数值运算,则必须制定变量类型为数值型
  • 变量用等号=复制,等号左右两侧不能有空格
  • 变量的值中如果有空格则需要使用单引号或双引号括起来
  • 在变量定义中可以使用“\”转义符
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要使用双引号包含“ 变 量 名 ” 或 变量名”或 {变量名}。
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
  • 环境变领命建议大写,便于区分

2、变量的分类

  • 用户自定义变量:由用户自由定义变量名和变量的值
  • 环境变量:主要保存的是系统和操作环境相关数据
  • 位置参数变量:主要用来向脚本当中传递参数或数据,变量名不能自定义,变量的作用是固定的
  • 预定义变量:Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

3、用户自定义变量

  • 变量的定义

    [root@localhost ~]#a="hello world"
    #变量名=“变量值”
    
  • 变量的调用

    [root@localhost ~]# echo $a
    hello world
    
  • 变量的查看

    set [选项]
    
    -u	如设定此项,调用为生命变量时会报错(默认无任何提示)
    -x	如设定此项,在命令执行前会把命令先输出一次
    
    [root@localhost ~]# set
    BASH=/bin/bash
    BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore: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]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
    BASH_VERSION='4.1.2(1)-release'
    COLORS=/etc/DIR_COLORS
    COLUMNS=168
    CVS_RSH=ssh
    DIRSTACK=()
    DISPLAY=localhost:11.0
    EUID=0
    GROUPS=()
    G_BROKEN_FILENAMES=1
    HISTCONTROL=ignoredups
    HISTFILE=/root/.bash_history
    HISTFILESIZE=1000
    HISTSIZE=1000
    HOME=/root
    HOSTNAME=localhost.localdomain
    HOSTTYPE=x86_64
    ID=0
    IFS=$' \t\n'
    LANG=zh_CN.UTF-8
    LESSOPEN='||/usr/bin/lesspipe.sh %s'
    LINES=39
    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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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
    OPTERR=1
    OPTIND=1
    OSTYPE=linux-gnu
    PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    PIPESTATUS=([0]="0")
    PPID=5867
    PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    PS1='[\u@\h \W]\$ '
    PS2='> '
    PS4='+ '
    PWD=/root
    QTDIR=/usr/lib64/qt-3.3
    QTINC=/usr/lib64/qt-3.3/include
    QTLIB=/usr/lib64/qt-3.3/lib
    SELINUX_LEVEL_REQUESTED=
    SELINUX_ROLE_REQUESTED=
    SELINUX_USE_CURRENT_RANGE=
    SHELL=/bin/bash
    SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
    SHLVL=1
    SSH_CLIENT='10.10.19.88 63076 22'
    SSH_CONNECTION='10.10.19.88 63076 10.10.19.6 22'
    SSH_TTY=/dev/pts/1
    TERM=xterm
    UID=0
    USER=root
    _=world
    a='hello world'
    colors=/etc/DIR_COLORS
    
  • 变量的删除

    unset 变量名
    
    [root@localhost ~]# unset a
    [root@localhost ~]# set
    BASH=/bin/bash
    BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore: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]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
    BASH_VERSION='4.1.2(1)-release'
    COLORS=/etc/DIR_COLORS
    COLUMNS=168
    CVS_RSH=ssh
    DIRSTACK=()
    DISPLAY=localhost:11.0
    EUID=0
    GROUPS=()
    G_BROKEN_FILENAMES=1
    HISTCONTROL=ignoredups
    HISTFILE=/root/.bash_history
    HISTFILESIZE=1000
    HISTSIZE=1000
    HOME=/root
    HOSTNAME=localhost.localdomain
    HOSTTYPE=x86_64
    ID=0
    IFS=$' \t\n'
    LANG=zh_CN.UTF-8
    LESSOPEN='||/usr/bin/lesspipe.sh %s'
    LINES=39
    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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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
    OPTERR=1
    OPTIND=1
    OSTYPE=linux-gnu
    PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    PIPESTATUS=([0]="0")
    PPID=5867
    PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    PS1='[\u@\h \W]\$ '
    PS2='> '
    PS4='+ '
    PWD=/root
    QTDIR=/usr/lib64/qt-3.3
    QTINC=/usr/lib64/qt-3.3/include
    QTLIB=/usr/lib64/qt-3.3/lib
    SELINUX_LEVEL_REQUESTED=
    SELINUX_ROLE_REQUESTED=
    SELINUX_USE_CURRENT_RANGE=
    SHELL=/bin/bash
    SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
    SHLVL=1
    SSH_CLIENT='10.10.19.88 63076 22'
    SSH_CONNECTION='10.10.19.88 63076 10.10.19.6 22'
    SSH_TTY=/dev/pts/1
    TERM=xterm
    UID=0
    USER=root
    _=a
    colors=/etc/DIR_COLORS
    

4、环境变量

  • 环境变量的设置

    #使用export声明环境变量
    #export 变量名=变量值
    [root@localhost ~]# export age="18"
    
  • 环境变量的查询和删除

    查询环境变量:

    env和set命令的区别:set命令可以查看所有的变量,env命令只能查看环境变量

    [root@localhost ~]# env
    HOSTNAME=localhost.localdomain
    SELINUX_ROLE_REQUESTED=
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=10.10.19.88 63076 22
    SELINUX_USE_CURRENT_RANGE=
    QTDIR=/usr/lib64/qt-3.3
    QTINC=/usr/lib64/qt-3.3/include
    SSH_TTY=/dev/pts/1
    USER=root
    ...
    age=18
    ...
    
    

    删除环境变量:

    删除环境变量与删除用户变量相同均使用unset。

    [root@localhost ~]# unset age
    
  • 系统默认环境变量

    [root@localhost ~]# env
    HOSTNAME=localhost.localdomain		#主机名
    SELINUX_ROLE_REQUESTED=
    TERM=xterm							#终端环境
    SHELL=/bin/bash						#当前sehll
    HISTSIZE=1000						#历史命令条数
    SSH_CLIENT=10.10.19.88 63076 22		#当前ssh客户端IP
    SELINUX_USE_CURRENT_RANGE=
    QTDIR=/usr/lib64/qt-3.3				#QT
    QTINC=/usr/lib64/qt-3.3/include		#QT
    SSH_TTY=/dev/pts/1					#ssh连接的中断时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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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/lib64/qt-		3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin											#系统查找命令的路径
    PWD=/root							#当前用户所在目录
    LANG=zh_CN.UTF-8					#操作系统的语言
    SELINUX_LEVEL_REQUESTED=
    HISTCONTROL=ignoredups
    SHLVL=1								#当前在第一层子shell中
    HOME=/root
    LOGNAME=root						#当前登录的用户
    QTLIB=/usr/lib64/qt-3.3/lib			#QT
    CVS_RSH=ssh
    SSH_CONNECTION=10.10.19.88 63076 10.10.19.6 22	#ssh连接信息
    LESSOPEN=||/usr/bin/lesspipe.sh %s
    DISPLAY=localhost:11.0
    G_BROKEN_FILENAMES=1
    _=/bin/env
    
    

    4.1环境变量配置文件

    • 环境变量配置文件调用过程

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tk2Jci5t-1592488239138)(.\images\000\1592467603932.png)]

    • 登录时生效的环境变量配置文件
      • /etc/profile

        /etc/profile环境变量会在用户登录过程中先调用,在这个环境变种配置文件中会定义以下默认环境变量:

        环境变量名用途
        USER根据登录用户进行赋值,代表当前用户
        LOGNAME根据USER变量的值给这个变量赋值
        MAIL根据登录的用户定义用户的邮箱为/var/spool/mail/用户名
        PATH根据登录用户的UID是否为0,判断PATH变量是否包含/sbin,/usr/sbin,/usr/local/sbin这三个系统命令目录
        HOSTNAME根据主机名给这个变量赋值
        HISTSIZE定义历史命令的保存条数
        umask定义umask默认权限,/etc/profile中的umask全显示在有用户登录过程也就是输入了用户名和密码时才生效。
        /etc/profile.d/*.sh调用/etc/profile.d目录下所有.sh结尾的文件
      • /etc/profile.d/*.sh

        被/etc/profile调用

      • ~/.bash_profile

        被/etc/profile调用

        • 调用~/.bashrc文件
        • 在PATH变量后加入“:$HOME/bin”目录
      • ~/.bashrc

        被~/.bash_profile调用

        • 定义了默认别名
        • 调用/etc/bashrc
      • /etc/bashrc

        被~/.bash_profile调用

        • PS1变量:即用户提示符,如需修改提示符再此修改。
        • umask:定义umask默认权限,这个文件中定义的uamsk是针对“没有登录过程”也就是无需输入账号密码时生效的。
        • PATH变量:会给PATH变量追加值,同样也是在没有登录过程时才生效。
        • 调用/etc/profile.d/.sh文件,仅在没有用户登录过程时才调用。在有用户登录过程是/etc/profile.d/.sh已经被/etc/profile调用。
      • 关于用户自定义环境变量存放位置
        用途存放位置
        对所有用户生效/etc/profile
        仅对自己生效/.bash_profile或./bashrc
    • 注销时生效的环境变量配置文件

      在用户退出登录时,只会调用一个环境变量配置文件~/.bash_logout。这个配置文件默认为空,如果我们需要在退出登录时执行一些操作,比如清理历史命令、备份数据等就可以把命令写入这个配置文件。

    • 其他配置文件

      例如~/bash_history文件,用于保存历史命令。

5、位置参数变量

位置参数变量作用
$nn为数字,$0代表命令本身,$1- 9 代 表 命 令 后 第 一 个 到 第 九 个 参 数 , 10 以 上 的 参 数 需 要 用 大 括 号 括 起 来 , 如 9代表命令后第一个到第九个参数,10以上的参数需要用大括号括起来,如 910{10}
$*代表命令中所有的参数,$*是把所有的参数看成一个整体
$@代表命令中所有的参数,与 ∗ 不 同 的 是 *不同的是 @会把每个参数区分对待
$#代表命令行中所有参数的个数

6、预定义变量

预定义变量作用
$?最后一次执行的命令返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确。
$$当前进程号(PID)
$!后台运行的最后一个进程的进程号(PID)

7、运算符与数值运算工具

7.1运算符

优先级运算符说明
13-,+单目负,单目正
12!,~逻辑非,按位取反或补码
11*,/,%乘、除、取模
10+,-加、减
9<<,>>按位左移,按位右移
8<=,>=,<,>小于等于,大于等于,小于,大于
7==,!=等于,不等于
6&按位与
5^按位异或
4|按位或
3&&逻辑与
2||逻辑或
1=,+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>=赋值、预算且赋值

7.2数值运算工具

  • 使用declare声明变量类型

    我们之前已经说过了,默认情况下对变量的赋值都是字符串类型,想要进行变量的运算,首先需要声明变量的类型。

    declare [+/-] [选项] 变量名
    
    +/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
    -a	将变量声明为数组类型
    -f  仅显示函数。
    -r 	将变量设置为只读。
    -x 	指定的变量会成为环境变量,可供shell以外的程序来使用。
    -i 	[设置值]可以是数值,字符串或运算式。
    -x	将变量声明为环境变量
    -p	显示置顶变量的类型
    
    [root@localhost disk_lv]# declare -p aa
    declare -- aa="10"						#字符串
    [root@localhost disk_lv]# declare -p bb
    declare -- bb="20"						#字符串
    [root@localhost disk_lv]# declare -i cc=$aa+$bb		#声明为整数型
    [root@localhost disk_lv]# echo $cc
    30
    
  • 使用expr和let数值运算工具

    expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

    expr 表达式
    

    let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

    let arg [arg ...]		#arg:要执行的表达式
    
    [root@localhost disk_lv]# dd=$(expr $aa + $bb)&&echo $dd
    30
    #注意,“+”号的左右两侧必须有空格否则不运算
    [root@localhost disk_lv]# let ee=$aa+$bb&&echo $ee
    30
    [root@localhost disk_lv]# n=30
    [root@localhost disk_lv]# let n+=10 && echo $n
    40
    #推荐使用let
    
  • 使用 ( ( 运 算 式 ) ) 或 ((运算式))或 (())[运算式]方式运算

    [root@localhost disk_lv]# ff=$(($aa+$bb)) && echo $ff
    30
    [root@localhost disk_lv]# gg=$[$aa+$bb] && echo $gg
    30
    

8、变量的测试与内容置换

变量置换变量y没有设置变量y为空变量y设置值
x=${y-新值}x=新值x为空x=$y
x=${y:-新值}x=新值x=新值x=$y
x=${y+新值}x为空x=新值x=新值
x=${y:+新值}x为空x为空x=新值
x=${y=新值}x=新值,y=新值x为空,y=新值x=$y,y值不变
x=${y:=新值}x=新值,y=新值x=新值,y=新值x=新值,y=新值
x=$[y?新值]新值输出到标准错误输出x为空x=$y
x=$[y:?新值]新值输出到标准错误输出新值输出到标准错误输出x=$y

九、Shell 的欢迎信息

  • /etc/issue

    用途为在本地终端登录时显示欢迎信息。

    转义符作用
    \d显示当前系统日期
    \s显示操作系统名称
    \l显示登录的终端号
    \m显示硬件体系结构
    \n显示主机名
    \o显示域名
    \r显示内核版本
    \t显示当前系统时间
    \u显示当前登录用户的序列号
    [root@localhost disk_lv]# cat /etc/issue
    CentOS release 6.7 (Final)
    Kernel \r on an \m
    当前日期:\d
    当前时间:\t
    操作系统名称:\s
    终端号:\l
    硬件体系:\m
    主机名:\n
    域名:\o
    内核版本:\r
    用户序列号:\u
    当前使用本地终端登录!
    
  • /etc/issue.net

    用途为在远程登录时显示欢迎信息。

    注意:转义符在/etc/motd中不生效.

    [root@localhost disk_lv]# cat /etc/issue.net 
    CentOS release 6.7 (Final)
    Kernel \r on an \m
    当前使用远程终端登录!
    #如需在ssh远程登录时可以看到/etc/issue.net的欢迎信息,需要修改ssh的配置文件/etc/ssh/sshd_config
    [root@localhost disk_lv]# cat /etc/ssh/sshd_config |grep Banner
    Banner /etc/issue.net
    #重启ssh
    [root@localhost disk_lv]# /etc/init.d/sshd restart
    停止 sshd:                                                [确定]
    正在启动 sshd:                                            [确定]
    
    
  • /etc/motd

    用途为在用户输入用户名和密码正确登录之后显示欢迎信息。不论是本地登录还是远程登录都可以显示

    注意:转义符在/etc/motd中不生效.

    [root@localhost disk_lv]# vi /etc/motd 
    [root@localhost disk_lv]# cat /etc/motd 
    登录成功,欢迎您!
    当前欢迎信息由/etc/motd配置!
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值