shell基础知识

10.1 什么是shell

shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西——系统内核;用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作

10.1.1 记录命令历史

只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存在.bash_history文件中

  • !!:连续两个!表示执行上一条命令

[root@localhost ~]# !!
ll
total 4
-rw-------. 1 root root 1585 Mar 14 15:40 anaconda-ks.cfg
[root@localhost ~]#

  • !n:这里的n指的是数字,表示执行命令历史中的第n条指令

    [root@localhost ~]# !10
    ls /mnt/
    [root@localhost ~]#
    
  • !字符串(字符串大于或等于1):例如!pw表示查找命令历史中最近一次以pw开头的命令

    [root@localhost ~]# !pw
    pwd
    /root
    [root@localhost ~]#
    

10.1.2 命令和文件名补全

tab:补全一个指令、一个路径或者一个文件名;连续按两次tab键,系统则会把所有的命令或者文件名列出来

10.1.3 别名

alias:把常用且很长的指令另取为一个简单好记的指令

查看别名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 [命令别名]=[‘具体的命令’]

 [root@localhost ~]# alias aming='pwd'
 [root@localhost ~]# aming
 /root
 [root@localhost ~]#

解除别名格式为:unalias [命令别名]

  [root@localhost ~]# unalias aming
  [root@localhost ~]# aming
  -bash: aming: command not found
  [root@localhost ~]# 

10.1.4 通配符

在bash下,可以使用*来匹配零个或多个字符,用?匹配一个字符

[root@localhost ~]# ls d*
 ddbb  dlrab     
[root@localhost ~]# ls xc?a
 xcda

10.1.5 输入/输出重定向

输入重定向:改变命令的输入,命令是 <
输出重定向:改变命令的输出,命令是 >

[root@localhost ~]# cat 1.txt
123
456
[root@localhost ~]# echo "111" > 1.txt
[root@localhost ~]# cat 1.txt
111
[root@localhost ~]# echo "222" >> 1.txt
[root@localhost ~]# cat 1.txt
111
222

10.1.6 管道符

管道符 | ,它用于将前一个指令的输出作为后一个指令的输入

[root@localhost ~]# cat /etc/passwd |head -3
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/nologin
 daemon:x:2:2:daemon:/sbin:/sbin/nologin

10.1.7 作业控制

  • 运行过程时,Ctrl+Z暂停进程

  • 运行过程时,Cttl+C终止进程

    [1]+  Stopped         vi 1.txt         ///上面在编辑内容,Ctrl+Z暂停
    [root@localhost ~]# 
    

    多个暂停的任务使用jobs命令

     [root@localhost ~]# jobs
     [1]-  Stopped                 vi 1.txt
     [2]+  Stopped                 vi 2.txt
     [root@localhost ~]#
    

    暂停后恢复,使用fg命令

     [root@localhost ~]# fg //多个任务会有编号,在fg后面添加数字即可
    

    暂停后将它转到后台运行

    [root@localhost ~]# bg
    

    关闭当前的shell,再次打开另一个shell时,使用jobs命令并不会显示在后台运行或者被暂停的任务;要想关闭这些任务,需要知道它们的pid

    [root@localhost ~]# ps aux |grep vmstat
    root       1390  0.0  0.0 112712   968 pts/0    S+                05:36   0:00 grep --color=auto vmstat
    [root@localhost ~]#
    

    如果想结束该进程,使用kill命令

    == 格式为:kill + pid ,遇到结束不了的进程,加一个选项,即kill -9 [pid]==

10.2 变量

shell预设的变量都是大写的。变量就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据,就拿PATH来讲,它就是代替了所有常用命令的绝对路径的设定。

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]#

10.2.1 命令env

使用env命令,可列出系统预设的全部系统变量

[root@localhost ~]# env
XDG_SESSION_ID=2
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.37.1 6912 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
。。。。省略

登陆不同的用户,环境变量的值也不同。当前显示的是root账户的环境变量,以下是常见的环境变量

  • HOSTNAME:表示主机的名称
  • SHELL:表示当前用户的shell类型
  • HISTSIZE:表示历史记录数
  • MAIL:表示当前用户的邮件存放目录
  • PATH:该变量决定了shell将到哪些目录中寻找命令或程序
  • PWD:表示当前目录
  • LANG:这是与语言相关的环境变量,多语言环境可以修改此环境变量
  • HOME:表示当前用户的家目录
  • LOGNAME:表示当前用户的登录名

10.2.2 命令set

和env命令相似,也可以输出环境变量

[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=()
。。。省略

set命令不仅可以显示系统预设的变量,也可以显示用户自定义的变量

    [root@localhost ~]# myname=Aming
    [root@localhost ~]# echo $myname
     Aming
    [root@localhost ~]# set | grep myname 
    myname=Aming
    [root@localhost ~]#

虽然可以自定义变量,但是该变量只能在当前shell中生效

  [root@localhost ~]# bash //执行该命令,会进入一个子shell环境中
  [root@localhost ~]# echo $myname

  [root@localhost ~]#

可以用pstree指令查看bash结构

 [root@localhost ~]# yum install -y psmisc   //安装
 [root@localhost ~]# pstree |grep bash
    |-login---bash
    |-sshd---sshd---bash---bash-+-grep

如果想让这个变量在子shell中生效,要用到export指令

   [root@localhost ~]# abc=123
   [root@localhost ~]# echo $abc
    123
   [root@localhost ~]# bash
   [root@localhost ~]# echo $abc

   [root@localhost ~]# exit
    exit
   [root@localhost ~]# export abc
   [root@localhost ~]# echo $abc
    123
   [root@localhost ~]# bash
   [root@localhost ~]# echo $abc
    123

如果想让设置的环境变量一直生效:

  • 允许系统内所有用户登录后都能使用该变量。具体的方法是:在etc/profile文件的最后一行加入export myname=Aming,然后运行source /etc/profile就可以生效了。此时再运行bash命令或者切换到其他账户就可以看到效果

    [root@localhost ~]# echo "export myname=Aming">> /etc/profile
    [root@localhost ~]# source /etc/profile
    [root@localhost ~]# bash
    [root@localhost ~]# echo $myname
     Aming
    [root@localhost ~]# exit
     exit
    [root@localhost ~]# echo $myname
     Aming
    [root@localhost ~]# 
    
  • 仅允许当前用户使用该变量,方法是:在用户主目录下的.bashrc文件的最后一行加入export myname=Aming,然后运行source .bashrc就可以生效了。这时在登录test账户,myname变量则不会生效了。这里source命令的作用是将目前设定的配置刷新,不用注销再登录也能生效

Linux下设置自定义变量,有以下规则:

  • 设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格

  • 变量名只能由字母、数字以及下划线组成,不能以数字开头

  • 当变量内容带有特殊字符(如空格)时,需要加上单引号

    [root@localhost ~]# myname='Aming Li'   //如果内容本身就带引号,就加双引号
    [root@localhost ~]# echo $myname
     Aming Li
    

变量内容中需要用到其他命令,运行结果则可以使用反引号

 [root@localhost ~]# myname=`pwd`
 [root@localhost ~]# echo $myname
  /root
 [root@localhost ~]#

变量内容可以累加其他变量的内容,但需要加双引号

[root@localhost ~]# myname="$LOGNAME"Aming
[root@localhost ~]# echo $myname
rootAming
[root@localhost ~]#

取消某个变量,只需要输入unset变量名即可

[root@localhost ~]# unset abc
[root@localhost ~]# echo $abc

[root@localhost ~]#

10.3 系统环境变量与个人环境变量的配置文件

  • /etc/profile:这个文件预设了几个重要的变量,例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等

  • /etc/bashrc:这个文件主要预设umask以及PS1。这个PS1就是输入命令时前面那串字符

         [root@localhost ~]# echo $PS1
         [\u@\h \W]\$
         [root@localhost ~]
    

    其中\u指用户,\h指主机名,\w指当前目录,$指字符(普通用户,显示为$)

除了以上两个系统级别的配置文件外,每个用户的主目录下还有一下几个隐藏文件

  • -.bash_profile:该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次

  • .bashrc:该文件包括专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。例如,你可以将用户自定义的别名或者自定义变量写到这个文件中

  • .bash_history:该文件用于记录命令历史

  • .bash_logout:当退出shell时,会执行该文件,可以将一些清理的工作放到这个文件中

10.4 Linux shell 中的特殊符号

*10.4.1 代表零个或多个任意字符

     [root@localhost ~]# ls
	1.txt  2.txt  anaconda-ks.cfg  ddbb  dlraba  ryota  test  					xcda
	[root@localhost ~]# ls -d ddb*
	ddbb
	[root@localhost ~]#

10.4.2 ?只代表一个任意的字符

[root@localhost ~]# ls
1.txt  2.txt  anaconda-ks.cfg  ddbb  dlraba  ryota  test  xcda
[root@localhost ~]# ls -d ryot?
ryota
[root@localhost ~]# 

10.4.3 注释符号#

[root@localhost ~]# abc=123 #ryota
[root@localhost ~]# echo $abc
123
[root@localhost ~]#

10.4.4 脱义字符

这个字符会将后面的特殊符号(如*)还原为普通字符

 [root@localhost ~]# ls -d test\*
ls: cannot access test*: No such file or directory
[root@localhost ~]#

10.4.5 再说管道符|

将前面命令的输出作为后面命令的输入这里提到的后面的命令,不是所有命令都可以的,一般针对文档操作的命令比较常用。例如cat、less、head、tail、grep、cut、sort、wc、uniq、tee、tr、split、sed、awk等

[root@localhost ~]# cat 1.txt   //查看文件内容
111
333
222
[root@localhost ~]# cat 1.txt |wc -l   //wc -l   代表统计行数
3
[root@localhost ~]# 

10.4.6 命令cut

cut命令用来截取某一个字段,格式为:==cut -d ‘分隔字符’ [-cf] n,==这里的n是数字。

  • -d:后面跟分隔字符,分隔字符要用单引号括起来

  • -c:后面接的是第几个字符

  • -f:后面接的是第几个区块

    [root@localhost ~]# cat /etc/passwd | head -3    //常用查询
     root:x:0:0:root:/root:/bin/bash
     bin:x:1:1:bin:/bin:/sbin/nologin
     daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [root@localhost ~]# cat /etc/passwd | cut -d ':' -f5 |head -3  //截取第五个区块
    root
    bin
    daemon
    [root@localhost ~]# head -2 /etc/passwd | cut -c2  //截取第2个字符
    o
    i
    [root@localhost ~]# head -2 /etc/passwd | cut -c1-10    //截取1-10个字符
    root:x:0:0
    bin:x:1:1:
    [root@localhost ~]# 
    [root@localhost ~]# head -2 /etc/passwd | cut -c1,3,10  截取1,3,10字符
    ro0
    bn:
    [root@localhost ~]# 
    

10.4.7 命令sort

sort命令用做排序,格式为sort [-t 分隔符] [-kn1,n2] [-nru],这里n1和n2指的是数字

  • -t:后面跟分隔字符,作用跟cut的-d选项一样
  • -n:表示使用纯数字排序
  • -r:表示反向排序
  • -u:表示去重复
  • -kn1,n2:表示由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序

ps:sort后不加任何选项,则从首字母开始排序

   [root@localhost ~]# head -n5 /etc/passwd|sort
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
   [root@localhost ~]#

ps:-t选项后跟分隔符,-k选项后跟单个数字表示对第几个区域排序,-n选项表示使用纯数字排序

[root@localhost ~]# head -4 /etc/passwd | sort -t ':' -k3 -n
 root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/nologin
 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost ~]#

ps:-k选项后跟数字n1和n2表示对第n1和n2区域的字符串排序,-r选项则表示反向排序

[root@localhost ~]# head -4 /etc/passwd | sort -t ':' -k3,5 -r
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

10.4.8 命令wc

wc命令用于统计文档的行数、字符数或词数。

  • -l:统计行数

  • -m:统计字符数

  • -w:统计词数

    [root@localhost ~]# wc /etc/passwd
      20  28 892 /etc/passwd
    [root@localhost ~]# wc -l /etc/passwd
      20 /etc/passwd
    [root@localhost ~]# wc -m /etc/passwd
      892 /etc/passwd
    [root@localhost ~]# wc -w /etc/passwd
       28 /etc/passwd
    

10.4.9 命令uniq

uniq命令用来删除重复的行,-c选项表示统计重复的行数,并把行数写在前面

 [root@localhost ~]# cat 2.txt
   111
   222
   111
   333
 [root@localhost ~]# 

使用uniq前,必须先给文件排序,否则无效

 [root@localhost ~]# uniq 2.txt
  111
  222
  111
  333
 [root@localhost ~]# 
 [root@localhost ~]# sort 2.txt |uniq
  111
  222
  333
 [root@localhost ~]# 
 [root@localhost ~]# sort 2.txt |uniq -c
  2 111
  1 222
  1 333

10.4.10 命令 tee

tee命令后面跟文件名,作用类似于重定向>,但比重定向多一个功能,即把文件写入后面所跟文件时,还显示在屏幕上;命令常用于管道符|后

 [root@localhost ~]# echo "aaaaaa" | tee 1.txt
   aaaaaa
 [root@localhost ~]# 
 [root@localhost ~]# cat 1.txt
   aaaaaa
 [root@localhost ~]#

10.4.11 命令tr

命令tr用于替换字符,常用来处理文档中出现的特殊符号

  • -d:表示删除某个字符,后面要跟删除的字符

  • -s:表示删除重复的字符

    tar命令常用于把小写字母变成大写字母

    [root@localhost ~]# head -2 /etc/passwd | tr '[a-z]'        '[A-Z]'
     ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
     BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
    [root@localhost ~]# 
    

替换字符:

 [root@localhost ~]# grep 'root' /etc/passwd | tr 'r' 'R'
   Root:x:0:0:Root:/Root:/bin/bash
   opeRatoR:x:11:0:opeRatoR:/Root:/sbin/nologin
 [root@localhost ~]#

10.4.12 命令 split

split命令用于切割文档

  • -b:表示依据大小来分隔文档,单位为byte

    [root@localhost ~]# cd dd88
    [root@localhost dd88]# cp /etc/passwd ./
    [root@localhost dd88]# split -b 500 passwd
    [root@localhost dd88]# ls
      passwd  xaa  xab
    

    如何指定目标文件名

      [root@localhost dd88]# rm -rf xa*  //删除之前的
      [root@localhost dd88]# 
      [root@localhost dd88]# split -b 500 passwd 123
      [root@localhost dd88]# 
      [root@localhost dd88]# ls
       123aa  123ab  passwd
      [root@localhost dd88]#
    
  • -l:表示依据行数来分割文档

    [root@localhost dd88]# rm -f 123a*
    [root@localhost dd88]# 
    [root@localhost dd88]# split -l 10 passwd
    [root@localhost dd88]# 
    [root@localhost dd88]# wc -l *
     20 passwd
     10 xaa
     10 xab
     40 total
    [root@localhost dd88]#
    

10.4.13 特殊符号 $

符号 $ 可以用作变量前面的标识符,还可以和 !结合起来使用

    [root@localhost ~]# ls 1.txt
      1.txt
    [root@localhost ~]# 
    [root@localhost ~]# ls !$    // !$表示上调命令中最后一个变量
      ls 1.txt
      1.txt
    [root@localhost ~]#

10.4.14 特殊符号;

想在一行中运行两个或两个以上的命令,需要在命令之间加符号;

 [root@localhost ~]# mkdir testdir ; touch test1.txt //运行多个命令
 [root@localhost ~]# ls
    1.txt  anaconda-ks.cfg  ddbb    ryota  test1.txt  xcda
    2.txt  dd88             dlraba  test   testdir
 [root@localhost ~]#

10.4.15 特殊符号 ~

符号~表示用户的家目录,root用户的家目录是/root,普通用户的则是/home/username。

 [root@localhost ~]# cd ~
 [root@localhost ~]# pwd
  /root
 [root@localhost ~]# su Ryota
 [root@localhost ~]$ cd ~
 [root@localhost ~]$ pwd
 [root@localhost ~]$  /home/Ryota

10.4.16 特殊符号 &

想把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况

 [root@ryota ~]# sleep 30 &
 [1] 1511
 [root@ryota ~]# jobs
 [1]+  Running                 sleep 30 &
 [root@ryota ~]# 

10.4.17 重定向符号>、>>、2>和 2>>

重定向符号>和>>,分别代表取代和追加的意思,运行一个命令报错时,报错信息会显示在屏幕上;如果想重新定向到一个文本,则要用到2>和2>>,分别表示错误重定向和错误追加重定向

 [root@ryota ~]# ls aaaa
  ls: cannot access aaaa: No such file or directory
 [root@ryota ~]# ls aaaa 2> /tmp/error
 [root@ryota ~]# cat /tmp/error
  ls: cannot access aaaa: No such file or directory
 [root@ryota ~]# ls aaaa 2>> /tmp/error
 [root@ryota ~]# cat /tmp/error
  ls: cannot access aaaa: No such file or directory
  ls: cannot access aaaa: No such file or directory
 [root@ryota ~]#

10.4.18 中括号 [ ]

中括号内为字符组合,代表字符组合中的任意一个,可以时一个范围(1-3,a-z)

 [root@ryota testdir]# ls
  test1.txt  test2.txt  testb.txt
 [root@ryota testdir]# ls -d test[1-3].txt   //查看1-3范围
  test1.txt  test2.txt
 [root@ryota testdir]# ls -d test[12b].txt  //查看1,2,b范围
  test1.txt  test2.txt  testb.txt
 [root@ryota testdir]# ls -d test[1-9].txt   //查看1-9范围
  test1.txt  test2.txt
 [root@ryota testdir]# ls -d test[1-9a-z].txt   查看1-9,a-z范围
  test1.txt  test2.txt  testb.txt
 [root@ryota testdir]#

10.4.19 特殊符号 && 和 | |

  • command1 ; command2
  • command1 && command2
  • command1 | | command2

***ps***:
使用 ;时,不管command1是否执行成功,都会执行command2

使用 && 时,只有command1执行成功后,才会执行command2,否则不执行command2

[root@ryota testdir]# ls
 test1.txt  test2.txt  testb.txt
[root@ryota testdir]# ls test2 && touch test2
 ls: cannot access test2: No such file or directory
[root@ryota testdir]# ls test2
 ls: cannot access test2: No such file or directory
[root@ryota testdir]#

使用 || 时,command1执行成功后则command2不执行,否则执行command2,即command1和command2中总有一条命令执行

 [root@ryota testdir]# ls test2 || touch test2
  ls: cannot access test2: No such file or directory
 [root@ryota testdir]# ls test*
  test1.txt  test2  test2.txt  testb.txt
 [root@ryota testdir]#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值