linux中的bash shell的特性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中的bash shell的特性相关的知识,希望对你有一定的参考价值。

linux中的bash shell特性(基础)

Shell也称命令行解释器,是我们对linux进行操作最直接的接触的脚本,所以说这对我们的今后的学习过程中非常重要。

当然,linux这种功能强大的操作系统,不可能只有一个shell,我们可以cat一下/etc/shells/,就会发现我们的linux有好多shell,

[[email protected] ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

虽然linux可以让我们切换不同的shell,但是,每切换一个shell,只不过是建立一个子进程,所以我们用完exit即可退出,最好不要一直切换,每切换一个,就先exit上一个。非常注意的一点,除了/sbin/nologin之外,其他的shell都可以用来测试使用,因为这个shell是没有用户登录模式。

接下来我们着重说,bash shell的特性:

一、就是可以使用别名

    alias - 定义或显示别名。
             alias [-p] [名称[=值] ... ]
             注意:如果alias命令不带任何选项和参数,则表示显示所有已经定义并生效的别名设置;

             # alias ALIAS=‘COMMAND [OPTION]...[ARGUMENT]...‘

        unalias
            unalias - 从别名定义列表中删除每一个“名字‘。

            unalias [-a] 名称 [名称 ...]

[[email protected] ~]# alias mp=‘mkdir -pv‘
[[email protected] ~]# 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 mp=‘mkdir -pv‘
alias mv=‘mv -i‘
alias rm=‘rm -i‘
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘

[[email protected] ~]# mp /tmp/test.txt
mkdir: 已创建目录 "/tmp/test.txt"

[[email protected] ~]# unalias mp
[[email protected] ~]# mp /tmp/test.txt
bash: mp: 未找到命令...

        注意:
            无论使用alias还是unalias命令,其功能都会立即生效;这两命令的生命周期仅为当前shell的生命期;一旦注销登录,相当于关闭了bash,则使用alias命令定义的别名或使用unalias命令删掉的别名也会失效。

        对于每个用户来说,都有一个私有的bash的配置文件,就在用户的家目录中的一个隐藏文件,文件名为“.bashrc”,其主要功能就是用来保存命令的别名的定义;

            注意:
                在对于此文件中的命令别名进行便并保存之后,在当前已经运行的bash中并不会立即生效,需要重新加载此文件 才能使配置生效,以下两种操作皆可实现;
                    1.重启bash,注销之后再次登录即可;
                    2.执行文件中定义的命令:使用source命令,或者.命令;

[[email protected] ~]# ls -a
.                .bash_logout   .config    ex                    .swp      模板  下载
..               .bash_profile  .cshrc     .ICEauthority         .tcshrc   视频  音乐
anaconda-ks.cfg  .bashrc        .dbus      initial-setup-ks.cfg  .viminfo  图片  桌面
.bash_history    .cache         .esd_auth  .local                公共      文档
[[email protected] ~]# 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

                source(用source来执行一遍.bashrc目录,这样不用注销别名就可以立即生效)
                    source - 在当前 shell 中执行一个文件中的命令。
                    . - 在当前 shell 中执行一个文件中的命令。

                    格式:source/. 文件名 [参数]

二、bash的快捷键;
        C:表示Ctrl键
        M:Alt键
        E:Esc键
        DEL:Backspace键

        C-l:清屏,相当于clear命令;
        C-a:光标跳转至命令行编辑模式的行首;
        C-e:光标跳转至命令行编辑模式的行尾;
        C-k;删除命令行编辑模式的光标所在位置至行尾的内容;
        C-u;删除命令行编辑模式的光标所在位置至行首的内容;
        C-c:结束前台进程;
        M-.;引用上一个命令中的最后一个参数;(在Xshell中不能用)
        E,.:功能同M-.
            (这一个不是同时摁,摁一下Esc,在摁一下.);


    三.命令历史
        bash进程会保存其会话中的用户曾经执行过的命令,以方便用户重复执行某个命令操作;
            命令历史包括两方面:
                1.用户曾经执行过的命令;
                2.用户曾经执行过的命令的路径;

            在bash中有一个内置的变量PATH,PATH变量的值为当给钱系统中所有的命令的文件所在的路径的集合;

        命令如何被shell执行的?
            bash会将命令行的内容按照空白字符进行切片,分析第一个切片内容;
                1.判断第一个切片的内容是内部命令还是外部命令;
                    如果是内部命令,直接运行;
                    如果是外部命令,先找hash表中的路径缓存,如果有,则直接执行;否则需要通过查找PATH变量所包含路径中,是否有对应名称的文件;

                    使用hash命令查看被记住的命令文件的路径;
                        -r;清空hash表;

                    使用history命令查看被记住的命令的命令行参数;
                     history - 显示或操纵历史列表。
                     格式: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]

                         常用选项:
                             -c    删除所有条目从而清空历史列表。
                             -d 偏移量    从指定位置删除历史列表。

[[email protected] ~]# history 3
  327  2017-10-23 21:48:15 history -10
  328  2017-10-23 21:48:40 history 10
  329  2017-10-23 21:49:07 history 3
[[email protected] ~]# history -d 328
[[email protected] ~]# history 3
  328  2017-10-23 21:49:07 history 3
  329  2017-10-23 21:49:24 history -d 328
  330  2017-10-23 21:49:27 history 3

                 重复执行历史缓冲区的命令:
                         !NUMBER:重复执行历史缓冲区中编号“NUMBER”的命令;
                         !STRING:重复执行里缓冲区中以“STRING”开头的最后一次执行过的命令;
                         !?STRING:重复执行里缓冲区中包含了“STRING”的最后一次执行过的命令;
                         !-NUMBER:重复执行历史缓冲区中倒数第“NUMBER”条命令;
                         使用上、下arrow可以从历史缓冲区中调用命令,回车后执行;
                         C-r:在历史缓冲区中实行搜索,回撤之后执行;

                         !$:在历史缓冲区中调用最后一个命令的最后一个参数;
                         !^:在历史缓冲区中调用最后一个命令的第一个位置的参数;
                         !:NUMBER:在历史缓冲区中调用最后一个命令的第"NUMBER"的参数;

                         !SEQUENCE:NUMBER:历史缓冲区中调用第“SEQUENCE”条命令第“NUMBER”个参数;

在bash中与命令历史相关的内置变量:
                        HISTSIZE:历史缓冲区中能够保存的命令历史的最大条目数量,默认是1000;
                        HISTFILESIZE: ~/.bash_history文件中能够保存的命令历史的最大条目数量,默认值1000;
                        HISTTIMEFORMAT: 在命令历史缓冲区中记录历史命令时,同时记录命令的执行的时间戳标记;可以使用date命令的FORMAT来表示时间的记录格式;默认值为空;
                        HISTCONTROL:控制命令历史的记录方式;
                            ignoredups:忽略连续且相同的命令被记录到历史缓冲区,此为默认值;
                            ignorespace:以空白字符开头的命令不会被日记录到历史缓冲区;
                            ignoreboth:上述两种情况都不会被记录到历史缓冲区;

[[email protected] ~]# export HISTTIMEFORMAT="%F %T "
[[email protected] ~]# history 5
  180  2017-10-23 18:16:53 export HISTTIMEFORMAT="%F %T"
  181  2017-10-23 18:17:16 echo $HISTTIMEFORMAT
  182  2017-10-23 18:18:07 history
  183  2017-10-23 18:18:43 export HISTTIMEFORMAT="%F %T "
  184  2017-10-23 18:18:53 history 5

四.命令补全————(Tab)
        包括两个方向的内容:
            1.构成命令字符串的补全;
                参考PATH变量中的路径,对命令进行补全;
                    如果给出的字符串在PATH变量对应的路径是唯一的,则直接补全命令;
                    如果给出的字符串在PATH变量对应的路径不唯一,则bash给出提示;
                (如果路径太长,或者目录名字太长的,可以直接用tab键补齐)
            2.命令中参数所对应的字符串的补全;
                根据给出的路径进行补全;
                    如果给出的字符串在给出的路径对应的路径是唯一的,则直接补全命令;
                    如果给出的字符串在给出的路径对应的路径不唯一,则bash给出提示;

五.命令行展开
        1.~展开:
            ~:bash会自动将其展开为当前登录用户的家目录;
            ~STRING:bash会自动将其展开为以“STRING”为用户名的家目录;

            ~+:调用bash的内置变量“pwd”的值;
            ~-:调用bash的内置变量“OLDPWD”的值;

[[email protected] ~]# ~+
-bash: /root: 是一个目录
[[email protected] ~]# ~-
-bash: /tmp: 是一个目录

        2.{}展开;
            在“{}”中,可以填充一个以“,”分隔的路径列表,bash会将其展开为多个独立的路径;
            示例:mkdir -pv  /mnt/{boot/grub,sysroot/{proc,sys,bin,sbin,lib/modules,usr/{bin,sbin,lib},var/{run,log,lock},etc/init.d,dev,home,root,tmp}}

            1.txt{,1.bak} == 1.txt 1.txt.bak

六.命令的执行结果
        在bash中,命令的执行结果有两种:
            1.执行命令的输出结果:
                根据用户的需求获取到的命令执行的正常输出结果;
                命令引用或命令替换:
                    ``相当于$()
                    ``:反向单引号,反引号;

                    示例:
                        创建一个文件,文件名为test-系统时间
                        ~]#touch test-`date +%F-%H-%M-%S`

[[email protected] ~]# cp -a  /etc /backup/etc-‘date+%F-%T‘
    [[email protected] ~]# ll /backup
    总用量 24
    drwxr-xr-x. 138 root root 8192 10月 18 21:43 etc
    drwxr-xr-x. 138 root root 8192 10月 18 04:54 etc-date+%F-%T

           2.执行命令的状态返回值;
                与此前的一个命令是否成功执行相关的返回内容;
                bash使用一个特殊的内置变量来保存其内容:$?
                    $?实际上保存的是一个数值,其数值范围:0-255

                    其中:
                        0:表示命令执行成功;
                        1-255:表示命令执行失败;
                        1,2,127:bash中内置的命令执行失败的状态返回值:
                            1:表示小问题
                            2:表示严重问题
                            127:表示命令本身出现问题:

[[email protected] ~]# $?
bash: 0: 未找到命令...

                         其余数字(3-126 128-255):用户可以自定义的失败状态的返回值;

七.引用功能:
        ‘‘:强引用
            凡是被单引号引用的内容,bash在处理时,一律视其为普通字符,即使其本身是bash定义的具有特殊功能和作用字符亦是如此,但单引号本身除外;

        "":弱引用
            凡是被双引号引用的内容中,有些特殊字符仍会保留其特殊含义,如:$,\,""

[[email protected] ~]# echo ‘$PATH‘
$PATH
[[email protected] ~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin


    八.转义功能:
        \:bash定义的转义字符;大多数的情况下,“\”只能将其后面的一个字符转义;

        \COMMAND:取消定义过的命令别名,而使用命令本身的功能;

[[email protected] ~]# ls -1
anaconda-ks.cfg
initial-setup-ks.cfg
公共
模板
视频
图片
文档
下载
音乐
桌面
[[email protected] ~]# \ls -1
anaconda-ks.cfg
initial-setup-ks.cfg
公共
模板
视频
图片
文档
下载
音乐
桌面

这两个命令是不一样的,但是上传的时候,颜色消失了,上边的ls应该是有颜色的,\ls是没有颜色的。

九.Globbing————文件名通配符,简称为globa;
    *:匹配任意长度的任意字符或字符串:(某些特殊位置的“.”字符不能匹配;)
    ?:匹配任意单个字符;(某些特殊位置的“.”字符不能匹配;)
    []:匹配指定范围内的任意单个字符,必须匹配且只能匹配一个字符;
        指定范围的方法:
            1.枚举法:列出所有有效字符;
            2.范围指令:
                [0-9]:表示所有单个的十进制数字;
                [a-z]:a,A,b,B,c,C......,y,Y,z
                [A-Z]:A,b,B,c,C,.....y,Y,z,Z
            3.bash内建字符集:
                [:lower:]:所有小写字母
                [:upper:]:所有大写字母
                [:alpha:]:所有的字母,包括大小写;
                [:digit:]:所有的单个的十进制数字;
                [:alnum:]:所有的字母和十进制数字;
                [:punct:]:所有的符号;
                [:space:]:表示空白字符,包括空格和制表符;

[[email protected] etc]# ls [[:alpha:]][^[:alpha:]]*



            4.反向匹配:
                ^
                示例:
                    #ls [^[:digit:]]??   //表示文件名的第二个字符不能使十进制数字;

                注意:当前括号中有“^”表示字符集反向匹配时,注意“*”的使用,因为“*”通配范围可能会导致反向匹配失败;此类失败是因为在bash的globbing实在贪婪模式下匹配的;

十.管道
        |
        管道通常是用来连接多个命令的;将管道符号前面的命令的执行输出结果通过管道传递给管道符号后面的命令,让后面的命令将前面的命令的输出结果当场参数使用;

 注意:
                 1.一般来讲,但是被管道连接的命令,都应该能够在执行成功之后完成命结果的输出,否则管道无意义,
                 2.管道不是万能的,有些场合没法使用管道;

[[email protected] ~]# head -15 /etc/passwd|tail -7|tee /tmp/users
        tee: /tmp/users: 是一个目录
        mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        operator:x:11:0:operator:/root:/sbin/nologin
        games:x:12:100:games:/usr/games:/sbin/nologin
        ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        nobody:x:99:99:Nobody:/:/sbin/nologin
        systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
        systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin


以上是关于linux中的bash shell的特性的主要内容,如果未能解决你的问题,请参考以下文章

Linux基础3-1 Bash及其特性

Linux基础3-1 Bash及其特性

Shell程序及Linux中默认的Shell程序Bash的特性

Linux 基础学习bash特性

谢烟客---------Linux之Bash基础特性配置文件

Linux之bash特性