7、bash及其特性

7.1 shell,用户,进程和程序

shell: 程序和内核交流的外壳

    GUI:Gnome, KDE, Xfce

    CLI: sh, csh, ksh, bash, tcsh, zsh

只有一个程序,但可以打开多个进程

进程是程序的副本,进程是程序执行的实例,在内存当中运行

进程:在每个进程看来,当前主机上只存在内核和当前进程

7.2 bash:

7.2.1 用户分类

    分为管理员用户和普通用户,用不同的字符标识

        root:         #

        普通用户:   $

7.2.2 shell和子shell

    shell当中包含着 shell,子shell,可以同时打开多个shell,还可以交互打开

    父shell和子shell,并不知道彼此的存在

    bash--bash

    [root@Daniel-R480 ~]# su daniel

    [daniel@Daniel-R480 root]$

7.2.3 bash:特点及功能

    1、命令历史、命令补全

    2、管道、重定向

    3、命令别名

    4、命令行编辑

    5、命令行展开

    6、文件名通配

    7、变量

    8、编程

7.2.4 命令行编辑:

1、光标跳转:

    Ctrl+a:跳到命令行首

    Ctrl+e:跳到命令行尾

    (图形界面可使用Ctrl+左右键跳到行首和行尾)

    Ctrl+d:删除对应的后面的字符

    Ctrl+u: 删除光标至命令行首的内容

    Ctrl+k: 删除光标至命令行尾的内容

    Ctrl+l: 清屏

2、命令历史:

    查看命令历史:history

        -c:清空命令历史

        -d OFFSET [n]: 删除指定位置的命令

        [daniel@localhost ~]$ history -d 459

        [daniel@localhost ~]$ history -d 460 10

        -w:保存命令历史至历史文件中

        用户退出后命令会从缓存转移到家目录下的.bash_history当中

    PATH:命令搜索路径

    HISTSIZE: 命令历史缓冲区大小

    [daniel@localhost ~]$ echo $HISTSIZE

    1000

    命令历史的使用技巧:

        !n:执行命令历史中的第n条命令;

        !-n:执行命令历史中的倒数第n条命令; 

        !!: 执行上一条命令;

        !string:执行命令历史中最近一个以指定字符串开头的命令

    引用前一个命令的最后一个参数; 

        !$

        Esc+ .

        Alt+.   (本地支持,远程不支持)

    [root@Daniel-R480 ~]# cat calc.sh 

    #!/bin/bash

    #

    declare -i SUM=0

    for I in {1..100};do

        let SUM=$[$SUM+$I]

    done

    echo "The sum is : $SUM"

    [root@Daniel-R480 ~]# du !$

    du calc.sh

    0   calc.sh

    [root@Daniel-R480 ~]#

3、命令和路径补全:

    Linux 最小化安装时,是没有 tab 命令补全的,需要自己手动安装。

    # 安装

$ yum -y install bash-completion

    # 重新登录生效 

    PATH:环境变量路径正常,即可进行补全

    输入相应的开头,随后点击tab

    命令补全:搜索PATH环境变量所指定的每个路径下以我们给出的字符串开头的可执行文件,如果多于一个,两次tab,可以给出列表;否则将直接补全;

    路径补全:搜索我们给出的起始路径下的每个文件名,并试图补全;

4、命令别名和命令替换

    在shell中定义的别名仅在当前shell生命周期中有效;别名的有效范围仅为当前shell进程;

        alias newname=oldname

        alias CMDALIAS='COMMAND [options] [arguments]'

    [root@Daniel-R480 ~]# alias cl=clear

    [root@Daniel-R480 ~]# cl

    撤销别名,unalias +命令别名

        ualias CMDALIAS

    [root@Daniel-R480 ~]# unalias cl

    [root@Daniel-R480 ~]# cl

    -bash: cl: command not found

    [root@Daniel-R480 ~]# 

    \CMD(转义字符)

    \+命令可以取消命令别名

    命令替换: $(COMMAND), 反引号:`COMMAND`

        把命令中某个子命令替换为其执行结果的过程

    file-2013-02-28-14-53-31.txt

    [daniel@localhost ~]$ touch file-$(date +%F-%H-%M-%S)

    [daniel@localhost ~]$ touch file-$(date +%F-%H-%M-%S)

    [daniel@localhost ~]$ ls

    a  file-2021-06-03-03-00-26  file-2021-06-03-03-00-31  heloy  m  test  test2  x

    [daniel@localhost /]$ echo "the current directory is $(pwd)."

    the current directory is /.

    [daniel@localhost /]$ cd /opt

    [daniel@localhost opt]$ !-2

    echo "the current directory is $(pwd)."

    the current directory is /opt.

    [daniel@localhost opt]$ 

    bash支持的引号:

        ``: 命令替换

        "": 弱引用,可以实现变量替换

        '': 强引用,不完成变量替换

5、文件名通配, globbing

    *: 可匹配任意长度的任意字符

    [daniel@localhost ~]$ touch a asd adcs dfvsf fde dedas wdwa qwd

    [daniel@localhost ~]$ ls a*

    a  adcs  asd

    [daniel@localhost ~]$ ls a*d

    asd

    ?:可匹配任意单个字符

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

        [abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]

    [:space:]:空白字符

    [:punct:]:标点符号

    [:lower:]:小写字母

    [:upper:]: 大写字母

    [:alpha:]: 大小写字母

    [:digit:]: 数字

    [:alnum:]: 数字和大小写字母

        # man 7 glob可以查看这些列表

    [^]: 匹配指定范围之外的任意单个字符

    [root@localhost daniel]# ls [[:alpha:]]*[[:alpha:]]

    a b  adcs  asd  dedas  dfvsf  fde  heloy  qwd  test  wdwa

练习:

1、创建a123, cd6, c78m, c1 my, m.z, k 67, 8yu, 789等文件;注意,以上文件是以逗号隔开的,其它符号都是文件名的组成部分;

    [root@Daniel-R480 test1]# touch {a123,cd6,c78m,"c1 my","m.z","k 67",8yu,789}

    [root@Daniel-R480 test1]# ls

    789  8yu  a123  c1 my  c78m  cd6  k 67  m.z

2、显示所有以a或m开头的文件;

    [root@Daniel-R480 test1]# ls [am]*

    a123  m.z

    [root@Daniel-R480 test1]# 

3、显示所有文件名中包含了数字的文件;

    [root@Daniel-R480 test1]# ls *[0-9]* 

    789  8yu  a123  c1 my  c78m  cd6  k 67

    [root@Daniel-R480 test1]# ls *[[:digit:]]*

    789  8yu  a123  c1 my  c78m  cd6  k 67

    [root@Daniel-R480 test1]# 

4、显示所有以数字结尾且文件名中不包含空白的文件;

    [root@Daniel-R480 test1]# ls *[^[:space:]]*[0-9] 

    789  a123  cd6  k 67

    [root@Daniel-R480 test1]# 

5、显示文件名中包含了非字母或数字的特殊符号的文件;

    [root@Daniel-R480 test1]# ls *[^[:alnum:]]*

    c1 my  k 67  m.z

Comments Closed.