2018-05-30笔记(Linux shell基础知识)

第八章 shell基础

8.1 shell介绍

在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。CentOS7的默认shell为bash(Bourne Agin Shell),常见的还有zsh(power-shell)、ksh(Korn shell)

8.2 命令历史(history)

history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。
语法
history(选项)(参数)
选项

-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中。

参数
n:打印最近的n条历史命令。
实例
使用history命令显示最近使用的10条历史命令,输入如下命令:

[root@localhost ~]# history 10
   92  ls
   93  cd ..
   94  ls
   95  exit
   96  ls -a
   97  cd .ssh/
   98  ls
   99  cat known_hosts
  100  exit
  101  history 10

历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令默认仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。
定义变量HISTSIZE
编辑其配置文件/etc/profile

[root@localhost ~]# vim /etc/profile 
……
HISTSIZE=2000                                                   #####这里修改为2000
……
[root@localhost ~]# echo $HISTSIZE                 ######这里还是显示1000,用source运行下/etc/profile文件
1000
[root@localhost ~]# source /etc/profile
[root@localhost ~]# echo $HISTSIZE                        
2000

找到‘HISTSIZE=1000’,在此更改为你想要保存的数量,保存退出,然后执行命令‘source /etc/profile’刷新该配置文件才会生效。

更改history显示格式

[root@localhost ~]# echo $HISTTIMEFORMAT

[root@localhost ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
[root@localhost ~]# echo $HISTTIMEFORMAT
%Y/%m/%d %H:%M:%S
[root@localhost ~]# history
    1  2018/06/01 22:50:11 history
    2  2018/06/01 22:51:32 echo $HISTTIMEFORMAT
    3  2018/06/01 22:51:43 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
    4  2018/06/01 22:51:45 echo $HISTTIMEFORMAT
    5  2018/06/01 22:52:32 history

直接为‘HISTTIMEFORMAT’赋值即可,不过此时该格式只适用于当前终端。如果要其使用于所有用户,则需要将其写入/etc/profile配置文件并刷新后生效。

[root@localhost ~]# vim /etc/profile

……
HISTSIZE=1000
HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
……

保存退出!

[root@adai003 ~]# source /etc/profile

命令历史永久保存
即,使命令历史记录只能写入不能被删除!

[root@localhost ~]# chattr +a ~/.bash_history

使用文件特殊权限,为‘.bash_history’文件配置‘a’权限(只可追加,不可删除)
‘!!’命令
!!命令表示执行上一条运行的命令

[root@localhost ~]# w
 14:58:29 up 13 min,  1 user,  load average: 0.00, 0.01, 0.04
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.66.1     14:45    5.00s  0.01s  0.00s w
[root@localhost ~]# !!                             #可以看到上一条命令为w,这里输入!!也是执行w
w
 14:58:32 up 13 min,  1 user,  load average: 0.00, 0.01, 0.04
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.66.1     14:45    0.00s  0.01s  0.00s w

‘!’的用法:‘!n’(n代表数字),表示运行命令历史中的第n条命令;‘!word’,表示运行上一次以该word开头的命令。

[root@localhost tmp]# history
    1  history 
    2  ls
    3  cd /tmp
    4  touch 1.txt
    5  history
[root@localhost tmp]# !2                    #命令历史中第2条为ls
ls
1.txt
3.txt
3.txt.gz
[root@localhost tmp]# !history            #运行以history开头的命令
history
    1  history 
    2  ls
    3  cd /tmp
    4  touch 1.txt
    5  history
    6  ls
    7  history

8.3 命令补全和别名

命令补全Tab

按一次tab可以补全一个命令或参数(需要安装包bash-completion,并重启系统);按两次tab可以显示以某字母开头的所有命令或文件名。

alias命令

语法: alias [命令别名]=[具体命令] 设置别名
取消别名:unalias [命令别名]

直接输入alias会显示系统所有的别名:

[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

设置别名

[root@localhost ~]# alias mysql='/usr/local/mysql/bin/mysql'                        #除了可以把绝对路径加到PATH里,还可以把绝对路径设置别名

取消别名

[root@localhost ~]# unalias mysql

只对当前shell有效,要想永久生效可以把别名存放在配置文件‘~/.bashrc’(用户家目录下,只针对当前用户)和‘/etc/profile.d/’(针对所有用户,系统级别的)下:

[root@localhost ~]# cat ~/.bashrc 
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
[root@localhost ~]# cat /etc/profile.d/
256term.csh    colorgrep.sh   lang.csh       less.sh        which2.csh     
256term.sh     colorls.csh    lang.sh        vim.csh        which2.sh      
colorgrep.csh  colorls.sh     less.csh       vim.sh         
[root@localhost ~]# cat /etc/profile.d/vim.sh 
if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n "$ZSH_VERSION" ]; then
  [ -x /usr/bin/id ] || return
  ID=`/usr/bin/id -u`
  [ -n "$ID" -a "$ID" -le 200 ] && return
  # for bash and zsh, only if no alias is already set
  alias vi >/dev/null 2>&1 || alias vi=vim
fi

8.4 shell中的特殊符号

通配符‘*’代表零个或多个任意字符
通配符‘?’代表一个任意字符
中括号‘[]’,“ls [0-9].txt”表示0-9区间内的任意.txt文件
花括号‘{}’,“ls {1,2,3}.txt”表示括号内任意.txt文件

[root@localhost ~]# ll
总用量 152
-rw-r--r--  1 root root      0 6月   2 15:19      123.txt
-rw-r--r--  1 root root     81 5月  20 15:19    1.sh
-rw-r--r--  1 root root      0 5月  12 18:38     1.txt
-rw-r--r--  1 root root      0 6月   2 15:19       22.txt
-rwxr-xr-x  1 root root    204 5月  20 16:03   2.sh
-rw-r--r--. 1 root root     41 4月  30 19:56     2.txt
-rw-r--r--  1 root root      0 6月   2 15:19       333.txt
[root@localhost ~]# ll *.txt                                    ###*可以匹配0个或者多个.txt结尾的
-rw-r--r--  1 root root  0 6月   2 15:19   123.txt
-rw-r--r--  1 root root  0 5月  12 18:38  1.txt
-rw-r--r--  1 root root  0 6月   2 15:19    22.txt
-rw-r--r--. 1 root root 41 4月  30 19:56  2.txt
-rw-r--r--  1 root root  0 6月   2 15:19    333.txt
[root@localhost ~]# ll ?.txt                                   ###?问号只能匹配一个
-rw-r--r--  1 root root  0 5月  12 18:38   1.txt
-rw-r--r--. 1 root root 41 4月  30 19:56   2.txt
[root@localhost ~]# ls [0-9].txt                            ###[0-9]表示中括号中0到9区间中的任意一个数字,[12]表示1或者2,不是12,
1.txt  2.txt
[root@localhost ~]# ls {1,2,3}.txt                       ###{1,2,3}中间用逗号分隔,表示括号内任意.txt文件,也可以用{1..10}表示一个区间
ls: 无法访问3.txt: 没有那个文件或目录
1.txt  2.txt

8.5输入输出重定向

“>,>>,<,2>,2>>”
‘>’:输出重定向
‘>>’:追加重定向
‘2>’:错误重定向
‘<’:输入重定向
使用‘>’命令时会将文件内原有内容删除。

[root@localhost ~]# echo aaaa >1.txt
[root@localhost ~]# cat 1.txt
aaaa
[root@localhost ~]# echo bbb >1.txt 
[root@localhost ~]# cat 1.txt
bbb
[root@localhost ~]# echo ccc >>1.txt
[root@localhost ~]# cat 1.txt
bbb
ccc
[root@localhost ~]# ls 1.txt 2.txt 3.txt 1>1.log 2>1.log                 #把正确输出和错误输出都重定向到1.txt里面,也可这样2>&1
[root@localhost ~]# cat 1.log
1.txt
2.txt
ls: 无法访问3.txt: 没有那个文件或目录

8.6 管道符和作业控制

linux中管道符“|”的作用
命令格式:命令A|命令B,即命令A的正确输出作为命令B的操作对象(下图应用别人的图片)
2018-05-30笔记(Linux shell基础知识)
例如:

[root@localhost ~]# ls |grep txt                        
123.txt
1,txt
1.txt
22.txt
2.txt
333.txt

作业控制
Ctrl+z 暂停一个正在执行的任务
jobs 查看在后台运行的任务
bg[id] =background把任务调到后台运行
fg[id] =foreground把任务调到前台运行
“&” 命令后面加&相当于直接把任务调到后台运行

[root@localhost ~]# vi 1.txt           ####按CTRL+z暂停            
[1]+  已停止               vi 1.txt
[root@localhost ~]# jobs              #####jobs查看后台运行的任务
[1]+  已停止               vi 1.txt
[root@localhost ~]# fg 1              #####fg把作业调回前台运行
vi 1.txt
[1]+  已停止               vi 1.txt
[root@localhost ~]# bg 1             ####bg把作业放到后台运行,运行一条命令的时候,可以直接在命令后面加&,把命令直接放到后台运行
[1]+ vi 1.txt &
[1]+  已停止               vi 1.txt

8.7-8.8 shell变量

env命令:查看系统内置环境变量

[root@localhost ~]# env
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.66.1 50517 22
SSH_TTY=/dev/pts/0
HISTORY_FILE=/usr/local/domob/records/root/bash_history
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=zh_CN.UTF-8
。。。。

还可以使用set命令查看shell变量,该命令不仅可以显示系统内置环境变量,还可以显示用户自定义的环境变量。

[root@localhost ~]# 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=103
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTORY_FILE=/usr/local/domob/records/root/bash_history
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=41
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=/tmp
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=840
PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.66.1 50517 22'
SSH_CONNECTION='192.168.66.1 50517 192.168.66.130 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=1
_=env
colors=/root/.dircolors

自定义变量

[root@localhost ~]# a=22222                                    #####直接给a赋值
[root@localhost ~]# echo $a
22222

变量名规则: 字母、数字下划线,首位不能为数字;变量值有特殊符号时需要用单引号括起来(单引号有脱意功能)。

变量累加

[root@localhost ~]# a=123
[root@localhost ~]# b=456
[root@localhost ~]# echo $a$b
123456
[root@localhost ~]# c="$a$b"789
[root@localhost ~]# echo $c
123456789

注: 多个变量进行叠加时需要对目标变量(等号右边)加上双引号,并且当在对新的变量附加新的值的时候写法: c="$a$b"789。

全局变量

export
当在一个父shell下设定一个变量后,进入子shell该变量并不生效,如果想让该变量在子shell下生效需要使用export声明一下才可以(跨终端不生效)。 语法: export [变量名]
当export不指定变量时,它会声明系统所有变量。

[root@localhost ~]# a=22222
[root@localhost ~]# echo $a
22222
[root@localhost ~]# export a=22222
[root@localhost ~]# echo $a
22222
[root@localhost ~]# bash
[root@localhost ~]# echo $a
22222

说明: 当在子shell设定变量后即便声明后也不能在父shell生效

当打开多个终端的时候,使用查看$SSH_TTY变量查看当前所在终端:

[root@localhost ~]# w
 16:37:28 up  1:52,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.66.1     14:45    0.00s  0.13s  0.00s w        
[root@localhost ~]# echo $SSH_TTY
/dev/pts/0

bash命令&pstree命令

[root@localhost ~]# bash
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─agetty
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─2*[sendmail]
        ├─sshd───sshd───bash─┬─bash───pstree                
        │                    └─vi
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───{vmtoolsd}

在当前shell中国运行bash命令会进入一个新的shell,这个shell是原来shell的子shell,可以使用pstree命令把系统中所有进程以树状图结构打印出来,pstree所在行显示的即为当前所在shell(exit可以退出子shell)。

删除变量 unset

[root@localhost ~]# set
....
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=1
_=bash
a=22222
[root@localhost ~]# unset a         删除a变量
....
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=1
_=bash

8.9 环境变量配置文件

环境变量配置文件可划分为两个维度:系统环境变量配置文件和用户环境变量配置文件。

系统配置文件

/etc/profile 用户环境变量,交互,登录才执行
/etc/bashrc 用户不用登录,执行shell就生效
用户配置文件

~/.bashrc
~/.bash_profile
~/.bash_history
~/.bash_logout 在此可以设定退出登录时系统执行的操作(如清除缓存、清除历史记录等等)
变量PS1------定制linux shell提示符
该变量用于定义“[root@localhost ~]# ”此部分显示内容,默认为 PS1="[\u@\h \W]\$ "

“PS1='\ [\033[01;32m\ ]\u@\h\ [\033[00m\ ]:\ [\033[01;36m\ ]\w\ [\033[00m\ ] \ $ ' ” 带颜色显示
2018-05-30笔记(Linux shell基础知识)

猜你喜欢

转载自blog.51cto.com/13736286/2123475