Shell:bash基础特性及基础命令

bash基础特性及命令

1,命令历史 

  history 历史

    环境变量: 

      HISTORYSIZE:命令历史记录的条数: 

      HISTORYFILE:~/.bash_history 

      HISTORYFILESIZE:命令历史文件记录历史的条数 

    history  -d OFFSET(删除历史中指定的命令,OFFSET为偏移量) 

    -c : 清空命令历史:(clear)

    history #:显示历史中最近的#条命令 

    -a : 手动追加当前会话缓冲区的命令历史之历史文件中 

  调用历史中的命令: 

    !#: 重复执行第#条命令 

    !!: 重复运行上一条命令:

    !string: 调用历史中最近一个以string开头的命令:       

  调用上一条命令的最后一个参数:

    !$: 后面加上这个命令即可;

    ESC,. :先按ESC,松开后按.号;

    Alt+ . :按住Alt不放后按住.号;

        控制命令历史的记录方式: 

          环境变量:HISTCONTROL 

 

            ignoredups: 忽略重复的命令,连续且相同方为"重复"

            ignorespace: 忽略所有以空白开头的命令 

            ignoreboth: ignoredups,ignorespace ,ignore这两条命令

          修改环境变量值得方式:export 变量名=”值”

     变量赋值符号后难免的数据存储于变量名指向的内存空间,只对当前shell有效

    export命令用于设置或显示环境变量

        export HISTCONTROL="ignorespace" 将环境变量更改为忽略所有以空白开头

        echo $HISTCONTROL  显示环境变量

2,命令补全 

  bash执行命令: 

    内部命令 

    外部命令:bash根据PATH环境变量定义的路径,自左向右在每个路径搜寻以给定命令命名的文件,第一次找到即为要执行的命令。 

    直接补全:Tab,用户给定的字符串至于一条位移对应的命令 

    以用户给定的字符串为开头对应的命令不唯一,则再次Tab会给出列表。 

    安装bash-completion,yum install -y bash-completion

3,路径补全 

  把用户给出的字符串这个那个当做路径开头,并在指定的目录下所搜以指定的子字符串开头的文件名;

    如果唯一则直接补全;

    否则,再次Tab,给出列表。

4,命令行展开:

  ~: 展开为用户的主目录 

        ~USERNAME:展开为指定用户的主目录 

        {}: 可承载一个以逗号分隔的雷彪,并将其展开为多个路径 

    /tmp/{a,b}=/tmp/a,/tmp/b 

     /tmp/{tom,jerry}/hi=/tmp/tom/hi,/tmp/jerrty/hi 

5,目录管理类命令:

  cd,pwd,ls 

  mkdir,rmdir,rm,cp,mv 

  mkdir   rmdir 

  补充

  mkdir 创建目录

    mkdir [OPTIONS]  /path/to/somewhere 

          -p: 递归创建目录,存在于不报错,且可以自动创建所需的各目录 

          -v: 显示详细信息 

          -m MODE:创建目录时直接指定权限 

  tree 显示目录

    -d: 只显示目录

    -L level: 指定显示的层级数目

    -P pattern: 只显示由指定pattern匹配到的路径:

        rmdir 删除空目录

          rmdir [OPTION] …DIRECTORY… 

      -v: 显示过程 ;

      rm:删除目录 

      -r: 递归 

      -f: 不用询问 

      -rf: 递归删除目录,不用询问 

      -d: 只显示目录 

  练习:

    (1)一次创建多个目录 

      mkdir -p /tmp/x/y1 /tmp/x/y2 /tmp/x/y1/a /tmp/x/y1/b /tmp/x/y2/a /tmp/x/y2/b=mkdir -p /tmp/x/{y1,y2}/{a,b}

    (2)如何创建x_m,y_m,x_n,y_n

      mkdir {x,y}_{m,n}

    (3)如何创建/tmp/bin, /tmp/sbin, /tmp/usr/bin, /tmp/usr/sbin

      mkdir -p /tmp/{bin,sbin,usr/{bin,sbin}}

6,命令的执行结果状态 

  成功 

   失败 

  bash使用特殊变量$?保存最近一条命令的执行状态结果: 

    0: 成功 

    1-255: 失败 

  程序还行有两类结果: 

    程序的返回值:成功或者失败

    程序中的执行状态结果: 

7,文本文件查看命令: 

   cat,tac 

   more,less,tail,head 

  more  

    more [OPTIONS…] FILE… 

    -d: 显示翻页及退出提示 

    一屏一屏显示出来,空格键翻屏

  less 

    less [OPTIONS…] FILE… 

    man命令是使用less来工作的

  head 

    head [OPTIONS…] FILE… 

      -c #: 指定获取前#字节 例如:head -n 10 /etc/rc.d/rc.sysinit

      -n #: 指定获取前#行 

        -#: 指定获取前#行

  tail

    tail [OPTIONS…] FILE… 

      -c #: 指定获取后#字节

      -n #: 指定获取后#行 

        -#: 指定获取后#行

      -f: 跟踪显示文件新追加的内容:一般用于查看日志文件

8,文件的时间戳管理工具: 

   touch 

  文件:metadata,data 

    查看文件状态:stat 例如stat /tmp/yum.log

    三个时间戳: 

      access time:访问时间,简写为atime ,读取文件内容

      modify time:修改时间,mtime ,改变文件内容(数据)

      change time:改变时间,ctime,元数据发生改变。 

  touch命令:

    可以修改atime以及mtime,如果文件不存在,不使用-c时会直接创建一个文件并显示当前时间

    touch[OPTION]…FILE… 

      -a:only atime 

      -m:only mtime 

      -t STAMP: 

        STAMP=[[CC]YY]MMDDhhmm[.ss]      >>201805142201.35

      -c: 如果文件不存在,则不予创建

9,alias:命令别名

  通过alias命令实现
  (1)alias

  显示当前shell进程中所有可用的命令别名

    (2)alias NAME=‘VALUE‘
     定义别名NAME,相当于指令命令VALUE

    注意:在命令行中定义的别名,仅对当前shell进程有效,如果想永久有效,要定义在配制文件中;
      仅对当前用户有效:~/.bashrc  比如可以用上面的编辑器nano:nano .bashrc 进行编辑
      对所有用户都有效:/etc/bashrc

      注意:编辑配置给出的新配置不会立即生效

        bash进程重新读取配置文件,示例如下:
          source /path/to/config_file
          . /path/to/config_file

  撤销别名:unalias

      -a: 撤销所有别名

      unalias name 撤销某个别名

        注意:如果别名同原命令的名称,则如果要执行原命令,可以使用"\COMMAND"

10,glob(globbing)通配

    bash中用于实现文件名"通配"

  通配符:*, ?, [ ]

  (1) * 匹配任意长度的任意字符

    a*b(a开头b结尾):aab、ab、a123b

  (2) ? 任意单个字符

    a?b:aab, acb

    a??b: acvb, ahjb 

  (3) [ ] 匹配指定范围内的任意单个字符

    [a-z] 匹配单个字母,不区分大小写

    [A-Z] 匹配单个大写字母

  (4) [^] 匹配指定范围外的任意单个字符

    [^0-9] 匹配0-9之外的任意单个字符,

      例如aab, a@b, a2b 中a[^0-9]b: aab, a@b

      例如aab, a@b, a2b 中a[[:lower:]]b: aab, 只选中aab

    专用字符集合:
      [:digit:] 任意数字,相当于数字0-9

      [:lower:] 任意小写字母

      [:upper:] 任意大写字母

      [:alpha:] 任意大小写字母

      [:alnum:] 任意数字或字母

      [:space:] 表示空格
      [:punct:] 表示标点符号

  练习:      

    1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录;
      ls -d /var/l[[:digit:]][[:lower:]]
      ls -d /var/l[0-9][[:lower:]]
      ls l[[:digit:]][[:lower:]] /var 错误做法

    2、显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
      ls -d /etc/[[:digit:]][^[:digit:]]
      ls -d /etc/[0-9][^0-9]
      ls [[:digit:]][^[:digit:]] /etc 错误做法

    3、显示/etc目录下,以非字母开头,后面跟了一个字母及其他任意长度任意字符的文件或目录;
      ls -d /etc/[^[:alpha:]][[:alpha:]]
      ls [^[:alpha:]][[:alpha:]] /etc 错误做法

    4、复制/etc目录下,所有以m开头,以非数字结尾的文件或目录到/tmp/x目录中;
      cp -ra /etc/m*[^[:digit:]] /tmp/x

    5、复制/etc目录下,所有/etc目录下,所有以.d结尾的文件或目录到/tmp/x目录中;
      cp -ra /etc/*.d /tmp/x

    6、复制/etc目录下,所有以.conf结尾,且以m、n、r、p开头的文件或目录/tmp/x目录中;
      cp -ra /etc/[mnrp]*.conf /tmp/x

11,bash快捷键

    ctrl+l 清屏,相当于clear命令
    ctrl+a 光标跳转到命令开始处
    ctrl+e 光标跳转到命令结尾处
    ctrl+c 取消命令的执行
    ctrl+u 删除命令行首到光标所在处的所有内容
    ctrl+k 删除光标所在处到命令行结尾处的所有内容

12,bash的I/O重定向及管道

  程序:指令+数据
    读入数据:Input
    输出数据:Output

  打开的文件都有一个fd:file descriptor 文件描述符

  标准输入:keyboard,0
  标准输出:monitor,1
  标准错误输出:monitor,2

  I/O 重定向:改变标准位置

  输出重定向:

    COMMAND > NEW_POS,COMMAND >> NEW_POS 若目标不存在,则新建目标文件,后输出重定向;

      >: 覆盖重定向,目标文件的原有内容会被消除,覆盖

      >>:  追加重定向,新内容会追加到目标文件尾部

      # set -C: 禁止将内容覆盖输出到已有文件中;

          强制覆盖:>|

      # set +C: 允许覆盖重定向

      2> 覆盖重定向错误输出数据流,对于正常的输出无能为力

      2>> 追加重定向错误输出数据流

      标准输出和错误输出各自重定向到不同的位置;

        COMMAND > /path/to/file.out 2> /path/to/error.out

      合并标准输出和错误输出为同一个数据流进行重定向;

        &>: 覆盖重定向
        &>>: 追加重定向

        COMMAND > /path/to/file.out 2> &1

        COMMAND >> /path/to/file.out 2>> &1

          使用1代表标准输出,2代表错误输出,进行覆盖重定向

          使用1代表标准输出,2代表错误输出,进行追加重定向

  输入重定向: <

    tr命令: 转换或删除字符, 默认只从标准输入读取数据
    tr [option]... set1 [set2]

      例如:tr abc ABC < /etc/fstab 将fstab中的abc全转换成对应的ABC,这里强行从文件中读取

        -d: 对对应的内容进行删除

    HERE Doucumentation << 此处生成文档

      #cat << EOF

      #cat > /path/to/somefile <<EOF

      例如下面:

      # cat >> /tmp/test.out << EOF

      > how are you?

      > how old are you?

      > EOF

        此处,给定字符EOF(end of file)表示结束,当遇到给定字符代表结束,内容没有到屏幕当中,被储存到test.out文件中了

 

13, 管道:

  把前一个命令的输出当作后一个命令的输入

  COMMAND1 | COMMAND2 | COMMAND3 |...
  注意:最后一个命令会在当前shell进程的子shell进程中执行

  
[root@localhost ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘/USR/LIB64/QT3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN

[root@localhost ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘ | tr -d U/SR/LIB64/QT3.3/BIN:/SR/LOCAL/SBIN:/SR/LOCAL/BIN:/SBIN:/BIN:/SR/SBIN:/SR/BIN:/ROOT/BIN
复制代码
View Code

  tee命令

    一路输入,两路输出,两路输出为标准输出和输出至文件中并储存起来。
    tee [option]... [file]... 

      
[root@localhost ~]# tee /tmp/123
first line.
first line.
second line.
second line.

[root@localhost ~]# cat /tmp/123
first line.
second line.

[root@localhost ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘ | tee /tmp/path.out
/USR/LIB64/QT3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN
[root@localhost ~]# cat /tmp/path.out
/USR/LIB64/QT-3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN

[root@localhost ~]# echo $PATH | tee /tmp/tee.out | tr ‘a-z‘ ‘A-Z‘
/USR/LIB64/QT3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN
[root@localhost ~]# cat /tmp/tee.out
/usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
View Code

  练习:

    1、将/etc/passwd文件中的前5行内容转换为大写保存到/tmp/passwd.out文件中;

      
head -5 /etc/passwd | tr ‘a-z‘ ‘A-Z‘ | tee /tmp/passwd.out
head -5 /etc/passwd | tr ‘a-z‘ ‘A-Z‘ > /tmp/passwd.out
head -5 /etc/passwd | tr [[:lower:]] [[:upper:]] > /tmp/passwd.out
View Code

    2、将登陆到当前系统上用户信息中的后3位的信息转换为大写保存到/etc/who.out文件中;

      
who | tail -3 | tr ‘a-z‘ ‘A-Z‘ | tee /tmp/who.out
who | tail -3 | tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out
who | tail -3 | tr [[:lower:]] [[:upper:]] > /tmp/who.out 
View Code   

编程环境、shell脚本、文本文件、变量类型等;

14,提供了编程环境

  程序=指令+数据

  程序编程风格
    过程式:以指令为中心,数据服务于指令
    对象式:以数据为中心,指令服务于数据

  shell程序:提供了编程能力,解释执行

  程序的执行方式:
    计算机:运行二进制指令
    编程语言:
      低级:汇编
      高级:
        编译:高级语言-->编译器-->目标代码(C、C++、java)
        解释:高级语言-->解释器-->机器代码(shell、perl、python)

  过程式编程:
    顺序执行、循环执行、选择执行

    shell编程:过程式、解释执行
      编程语言的基本结构:

        数据存储(变量、数组)、表达式、语句

15,shell脚本:文本文件

  shebang机制:
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl

  magic number 魔数

  运行脚本:
    1、给予执行权限,通过具体的文件路径指定文件执行
    2、直接运行解释器,将脚本作为解释器程序的参数运行

      
[root@localhost ~]# mkdir scripts
[root@localhost ~]# nano first.sh
[root@localhost ~]# cat scripts/first.sh
#!/bin/bash   *以bash来解释执行*

cat /etc/fstab

wc -l /etc/fstab
[root@localhost ~]# ll scripts/first.sh
-rwxr--r-- 1 root root 47 6月   3 09:02 scripts/first.sh
[root@localhost ~]# chmod +x scripts/first.sh
[root@localhost ~]# ll scripts/first.sh
-rwxr-xr-x 1 root root 47 6月   3 09:02 scripts/first.sh
[root@localhost ~]# scripts/first.sh   *运行脚本第一种方法*

#
# /etc/fstab
# Created by anaconda on Sat May  5 17:43:23 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=edace35a-2d7e-4ec4-9d68-c7c4f14704fc /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
11 /etc/fstab
[root@localhost ~]# bash scripts/first.sh   *运行脚本第二种方法*

#
# /etc/fstab
# Created by anaconda on Sat May  5 17:43:23 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=edace35a-2d7e-4ec4-9d68-c7c4f14704fc /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
11 /etc/fstab
View Code

16,变量:命名的内存空间

  数据存储方式:ASCII
    字符:110 转换为二进制 24位
    数值:110 转换为二进制 8位(整型、浮点型)

  变量的作用:
    1、数据存储格式;

    2、参与的运算、

    3、表示的数据范围

  类型:
    字符
    数值:整型、浮点型

  编程程序语言:
    强类型:C
    弱类型:bash

      把所有要存储的数据统统当作字符进行,支持隐式类型转换、不支持浮点数

  逻辑运算:
    true、false(1、0)

      
 与:
      1 && 1=1
      1 && 0=0
      0 && 1=0
      0 && 0=0
    或:
      1 || 1=1
      1 || 0=1
      0 || 1=1
      0 || 0=0
    非:
      !1=0
      !0=1
View Code

  短路运算:
    与:
      第一个为0,结果必定为0

      
[root@localhost ~]# catt /etc/issue && cat /etc/issue
-bash: catt: command not found
    [root@localhost ~]# catt /etc/issue && cat /etc/issuee
    -bash: catt: command not found

    第一个为1,第二个必须要参与运算
    [root@localhost ~]# cat /etc/issue && echo "true"
    CentOS release 6.5 (Final)
    Kernel \r on an \m

    true

    [root@localhost ~]# cat /etc/issue && catt /etc/issue
    CentOS release 6.5 (Final)
    Kernel \r on an \m

    -bash: catt: command not found

或:
    第一个为1,结果必定为1
    [root@localhost ~]# cat /etc/issue || cat /etc/issue
    CentOS release 6.5 (Final)
    Kernel \r on an \m

    [root@localhost ~]# cat /etc/issue || catt /etc/issue
    CentOS release 6.5 (Final)
    Kernel \r on an \m

    第一个为0,第二个必须要参与运算
    [root@localhost ~]# catt /etc/issue || cat /etc/issue
    -bash: catt: command not found
    CentOS release 6.5 (Final)
    Kernel \r on an \m

    [root@localhost ~]# catt /etc/issue || cat /etc/issuee
    -bash: catt: command not found
    cat: /etc/issuee: No such file or directory
View Code

  与、或的混合应用
    [root@localhost ~]# cat /etc/issue &> /dev/null && echo "true" || echo "false"
    true

    [root@localhost ~]# catt /etc/issue &> /dev/null && echo "true" || echo "false"

    false

 17,作业控制

    ctrl z暂停一一个任务
    jobs查看后台的任务
    bg[id]把任务调到后台
    fg[id]把任务调到前台
    命令后面加&直接丢到后台

 

 

  变量

    env:获取系统常用变量名

    set:查看系统常用变量和用户自定义的变量

    自定义变量a=1
    变量名规则:字母、数字下划线,首位不能为数字
    变量值有特殊符号时需要用单引号括起来
    变量的累加
    全局变量export b=2
    unset变量

    pstree 查看树

    

  变量类型:

 

    数据存储格式、存储空间大小、参与运算种类

    字符型
    数值型(整型、浮点型)

    强类型:定义变量是必须指定类型,参与运算必须符合类型要求,调用未声明变量会产生错误;例如:C
    弱类型:无须指定类型,默认均为字符型,参与运算会自动进行隐式类型转换;例如:bash

  bash中的变量的种类:

    根据变量的生效范围的标准划分:
      本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
      环境变量:生效范围为当前shell进程及其子进程
      局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
      位置变量:$1、$2...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
      特殊变量:$?、$0

 

 

 

posted @ 2018-05-15 17:20  Qiuma  阅读(267)  评论(0编辑  收藏  举报
TOP ↑