zoukankan      html  css  js  c++  java
  • 【Linux相识相知】bash的特性

    命令历史

    shell进程会记录用户提交执行过的命令

    可以是用history查看:

    [root@localhost dev]# history 
        1  ss -tnl
        2  ifconfig
        3  vi /etc/sysconfig/network-scripts/ifcfg-ens33 
        4  reboot 
        5  systemctl stop firewalld
        6  systemctl disable firewalld
        7  ifconfig
        8  ifconfig
        9  startx
       10  ping 114.114.114.114
       11  top
    ......
      140  who -b
      141  who -r
      142  date
      143  w
      144  history 

    定制history的功能

    HISTSIZE:shell进程可以保留的命令历史的条数

    [root@localhost dev]# echo $HISTSIZE
    1000

    HISTFILE:持久保存命令历史的文件,当退出登录的时候,此次的命令历史才会被写入到HISTFILE中

    [root@localhost dev]# echo $HISTFILE
    /root/.bash_history
    [root@localhost dev]# cat /root/.bash_history
    ss -tnl
    ifconfig
    vi /etc/sysconfig/network-scripts/ifcfg-ens33 
    reboot 
    systemctl stop firewalld
    systemctl disable firewalld
    ifconfig
    ifconfig
    startx
    ping 114.114.114.114
    top
    ifconfig
    ifconfig --help
    type ls
    type ifconfig
    ......
    bash
    export name
    echo $name
    bash

    HISTFILESIZE:命令历史文件的大小

    [root@localhost dev]# echo $HISTFILESIZE
    1000

    history常用命令用法

    -c:清空命令历史

    -d offset:删除指定命令历史,offset为指定的行数

    -r:从文件读取命令历史至历史列表中

    -w:把历史列表中的命令追加至历史文件中

    history #:显示最近的#条命令

    调用命令历史列表中的命令

    !#:再次执行历史列表中第#条命令

    !!:再一次执行上一条命令

    !STRING:再一次执行命令历史列表中最近一个以STRING开头的命令

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

    快捷键:按一下ESC再按点.

    或者使用字符串:!$

    控制命令的记录方式

    [root@localhost /]# echo $HISTCONTROL
    ignoredups

    ignoredups:忽略重复的命令;

    ignorespace:忽略以空白字符开头的命令;

    ignoreboth:以上两者同时生效;

    补全功能

    命令补全

    shell程序在接受到用户执行命令的请求时,最左侧的字符串会被当做命令

    命令查找机制:首先查找内部命令,根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名

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

     使用Tab键补全

     

    路径补全

     在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下每个文件

    目录管理类命令

    mkdir

    make directories 创建目录

    mkdir [OPTION]... DIRECTORY...

    常用选项:

    -p:自动按需创建父目录

    [root@localhost tmp]# mkdir -p /tmp/x/y/z
    [root@localhost tmp]# cd /tmp/x/y/z/
    [root@localhost z]# 

     -v:显示详细过程,verbose

    [root@localhost z]# mkdir -pv /tmp/a/b/c
    mkdir: created directory ‘/tmp/a’
    mkdir: created directory ‘/tmp/a/b’
    mkdir: created directory ‘/tmp/a/b/c’

    -m MODE:直接给定权限

    注意:路径基名方为命令的作用对象,基名之前的路径必须得存在

     

    rmdir

    remove empty direcories

    移除空目录

    常用选项:

    -p:删除某目录后,如果其父目录为空,则一并删除之

    -v:显示过程

    [root@localhost b]# rmdir -pv /tmp/a/b/c/
    rmdir: removing directory, ‘/tmp/a/b/c/rmdir: removing directory, ‘/tmp/a/b’
    rmdir: removing directory, ‘/tmp/a’
    rmdir: removing directory, ‘/tmp’
    rmdir: failed to remove directory ‘/tmp’: Device or resource busy

    命令行展开

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

    例如:/tmp/{a,b}相当于 /tmp/a  /tmp/b

    例子:

    如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b?

    [root@localhost tmp]# mkdir -p /tmp/x/{y1/{a,b},y2}

    如何创建a_c, a_d, b_c, b_d?

    [root@localhost tmp]# mkdir -p /tmp/{a,b}_{c,d}

     如何创建如下目录结构:

                /tmp/mysysroot/
                    |-- bin
                    |-- etc
                    |   `-- sysconfig
                    |       `-- network-scripts
                    |-- sbin
                    |-- usr
                    |   |-- bin
                    |   |-- lib
                    |   |-- lib64
                    |   |-- local
                    |   |   |-- bin
                    |   |   |-- etc
                    |   |   |-- lib
                    |   |   `-- sbin
                    |   `-- sbin
                    `-- var
                        |-- cache
                        |-- log
                        `-- run
    mkdir -p /tmp/mysysroot/{bin,etc/sysconfig/networkscripts,sbin,usr/{bin,lib,lib64,local/{bin,etc,lib,sbin},sbin},var/{cache,log,run}}

     tree

     可使用tree来查看目录的层级结构

     

    -L #,指定要显示的层级

     命令的执行状态结果

    bash通过状态返回值来输出此结果:

    成功:0

    失败:1-255

    命令执行完成之后,其状态返回值保存于bash的特殊变量$?中

    [root@localhost tmp]# ls /tmp/x/
    y1  y2
    [root@localhost tmp]# echo $?
    0
    [root@localhost tmp]# ls /tmp/y
    ls: cannot access /tmp/y: No such file or directory
    [root@localhost tmp]# echo $?
    2

    引用

     引用命令的执行结果:

     $(COMMAND)或者`COMMAND`

     

     强引用,单引号:

    [root@localhost ~]# echo '$PATH'
    $PATH

     弱引用,双引号:

    [root@localhost ~]# echo "$PATH"
    /usr/local/sbin:/usr/loca

    快捷键

    ctrl+a:跳转至命令行行首

    ctrl+e:跳转至命令行行尾

    ctrl+u:删除行首至光标所在处之间的所有字符

    ctrl+k:删除光标所在处至行尾的所有字符

    ctrl+l:清屏,相当于clear

    文件查看类命令

     cat

    cat [OPTION]... [FILE]...

    查看文件内容,直接显示到文件底部

    常用选项:

    -n:可以显示行数

    [root@localhost tmp]# cat /etc/passwd
    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
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    ......
    gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
    avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin

    tac

    tac [OPTION]... [FILE]...

    反向查看文件内容

    [root@localhost tmp]# tac /etc/passwd
    tcpdump:x:72:72::/:/sbin/nologin
    avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
    ......
    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

    more

     分屏查看文件内容

    head

    head  [OPTION]... [FILE]...

    查看文件的前n行,默认为前10行

    [root@localhost tmp]# head /etc/passwd
    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
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    常用选项:
    head -n  #:显示前#行或者是head -#

    tail

    查看文件的后n行

    tail  [OPTION]... [FILE]...

    [root@localhost tmp]# tail /etc/passwd
    colord:x:992:987:User for colord:/var/lib/colord:/sbin/nologin
    qemu:x:107:107:qemu user:/:/sbin/nologin
    setroubleshoot:x:991:986::/var/lib/setroubleshoot:/sbin/nologin
    rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
    nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
    gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    sssd:x:990:985:User for sssd:/:/sbin/nologin
    gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
    avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin

    常用选项:

    tail -n #:显示最后#行或者是tail -#

    -f:查看文件尾部内容,结束后不退出,跟随显示新增的行

    stat

    display file or file system status

    文件:两类数据

    元数据:metadata,文件的状态,创建时间,修改时间,大小,权限等

    数据:文件里面的内容

    [root@localhost tmp]# stat /etc/passwd
      File: ‘/etc/passwd’
      Size: 2235          Blocks: 8          IO Block: 4096   regular file
    Device: fd00h/64768d    Inode: 19840519    Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: system_u:object_r:passwd_file_t:s0
    Access: 2017-07-06 09:25:43.555083116 -0400
    Modify: 2017-07-01 08:00:52.140151303 -0400
    Change: 2017-07-01 08:00:52.141154779 -0400
     Birth: -

    stat显示的就是文件的元数据,包含文件路径,大小,blocks数目,IO block,文件类型,inode号,权限,uid,gid和三个时间戳等

    三个时间戳:

    access:最近一次访问的时间

    modify:最近一次修改文件的时间

    change:文件最近一次改变的时间,即改变元数据的时间

    touch

    change file timestamps  修改时间戳

    touch [OPTION]... FILE...

    文件不存在则创建文件,当直接使用命令去touch一个文件的时候,修改的是所有的时间戳

    常用选项:

    -c:指定的文件路径不存在时不予以创建

    -a:仅修改access time

    -m:仅修改modify time

    -t   STAMP

           [[CC]YY]MMDDhhmm[.ss]

    (不能修改change time,只当元数据发生变化时,才会改变)

    [root@localhost tmp]# touch -t 201212121200.30  test.txt -m
    [root@localhost tmp]# stat test.txt 
      File: ‘test.txt’
      Size: 0             Blocks: 0          IO Block: 4096   regular empty file
    Device: fd00h/64768d    Inode: 17251556    Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: unconfined_u:object_r:user_tmp_t:s0
    Access: 2017-07-07 03:17:12.640883844 -0400
    Modify: 2012-12-12 12:00:30.000000000 -0500
    Change: 2017-07-07 03:19:17.667997201 -0400
     Birth: -
    [root@localhost tmp]# 

    wc

    NAME:输出文件中的行数、单词数、字节数

    SYNOPSIS:wc [选项列表]... [文件名列表]...

    常用选项:

    -l:输出行数

    -w:输出单词数,重复单词只算一个

    -c:输出字节数

    举例:

    [root@localhost tmp]# wc /etc/passwd
      40   78 2022 /etc/passwd

    cut

    NAME:在文件的每一行中提取片段

    SYNOPSIS:cut OPTION... [FILE]...

    常用选项:-d CHAR:以指定的字符为分隔符

                      -f  FIELDS:挑选出的字段

                      #:指定的单个片段

                      #-#:连续的多个字段

                      #,#:离散的多个字段

    举个例子

    [root@localhost tmp]# cut -d: -f1 /etc/passwd
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    ....
    frank
    Frank
    centos

    sort

    NAME:对文本文件的行排序

    SYNOPSIS:sort  [OPTION]...  [FILE]...

    常用选项:

    -n:基于数值大小而非字符进行排序

    -t CHAR:指定分隔符

    -k #:用于排序比较的字段

    -r:逆序排序

    -f:忽略字符大小写

    -u:重复行只保留一份,连续且相同

    举例:以:为分隔符,按第三个字段的数值大小比较排序文件/etc/passwd下的内容

    [root@localhost tmp]# sort -n -t: -k 3 /etc/passwd
    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
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    ....
    polkitd:x:998:997:User for polkitd:/:/sbin/nologin
    systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    frank:x:1000:1000:frank:/home/frank:/bin/bash
    Frank:x:1001:1001::/home/Frank:/bin/bash
    centos:x:1002:1002::/home/centos:/bin/bash
    nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

    uniq

    NAME:删除排序文件中的重复行

    SYNOPSIS:uniq [OPTION]... [INPUT [OUTPUT]]

    常用选项:

    -c:显示每行的重复次数

    -u:仅显示未曾重复的行

    -d:仅显示重复过的行

    文件管理工具

    cp

    复制文件或者目录

    单源复制:

    cp [OPTION]... [-T] SOURCE DEST

    如果DEST不存在,则先创建此文件,并复制源文件的数据流至DEST文件中

    如果DEST存在:

        如果DEST是非目录文件,则覆盖DEST文件

        如果DEST是目录文件,则在DEST目录下创建一个与源文件同名的文件,并复制其数据

    多源复制:

    cp [OPTION]... SOURCE... DIRECTORY
    cp [OPTION]... -t DIRECTORY SOURCE...

    如果DIRECTORY不存在,则报错

    如果DIRECTORY存在:

         如果DIRECTORY是非目录文件,则报错

         如果DIRECTORY是目录文件,分别复制每个文件至目标目录中,并保持原名

    常用选项:

    -i:交互式复制

    -f:强制覆盖目标文件

    -r,-R:递归复制目录

    -d:复制符号链接文件本身,而非指向的源文件

    -a:-dR --preserve=all, archive,用于实现归档;

    --preserv=

           mode:权限

            ownership:属主和属组

            timestamps: 时间戳

            context:安全标签

            xattr:扩展属性

            links:符号链接

            all:上述所有属性

    mv

    move

    移动文件,可用来重命名文件

    SYNOPSIS
           mv [OPTION]... [-T] SOURCE DEST
           mv [OPTION]... SOURCE... DIRECTORY
           mv [OPTION]... -t DIRECTORY SOURCE...

    常用选项:
    -i:交互式

    -f:强制覆盖文件

    rm

    remove

    移除文件

    rm [OPTION]... FILE...

    常用选项:

    -i:交互式移除文件

    -f:强制删除文件

    -r:递归删除

    注意:所有不用的文件建议不要直接删除,可以移动至某个专用的目录(用来做回收站的目录)

    diff

    NAME:找出2个文件中的不同

    SYNOPSISI:diff [OPTION]... FILES

    -u:使用unfied机制,即显示要修改行的上下文,默认为3行

    很好用的工具

    比如说我们现在有2个文件a.txt,b.txt

    [root@localhost tmp]# cat a.txt 
    111
    222
    333
    444
    555
    666
    [root@localhost tmp]# cat b.txt 
    111
    222
    333

    文本比较,会指出不同的行

    [root@localhost tmp]# diff a.txt b.txt 
    4,5d3
    < 444
    < 555

    我们可以把不同的行的信息保存到一个文件中(后面使用)

    [root@localhost tmp]# diff a.txt b.txt  > c.txt
    [root@localhost tmp]# cat c.txt 
    4,5d3
    < 444
    < 555
     
    patch

    NAME:向文件中打补丁

    SYNOPSIS:patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE

    如上个例子中,b.txt比a.txt少的内容保存在了补丁文件c.txt中,我们就可以使用patch来讲b比a少的内容补进去

    [root@localhost tmp]# patch  b.txt c.txt 
    patching file b.txt
    Reversed (or previously applied) patch detected!  Assume -R? [n] yes
    [root@localhost tmp]# cat b.txt
    111
    222
    333
    444
    555
    666

    Globbing

    文件名通配:是对整体文件名匹配,不是部分匹配

    匹配字符:

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

    ?:匹配任意单个字符

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

          [a-z],[A-Z],[0-9],[a-z0-9]   不区分大小写

          特殊格式:

         [[:upper:]]:所有大写字母

         [[:lower:]]:所有小写字母

         [[:alpha:]]:所有字母

         [[:digit:]]:所有数字

         [[:alnum:]]:所有的字母和数字

         [[:space:]]:所有空白字符

         [[:punct:]]:所有标点符号

    [^]:中括号加托字符,匹配指定范围外的任意单个字符

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

         [^[:upper:]]:匹配大写字母以外的任意单个字符

    练习:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录;

    ls -d /var/l?[[:lower:]]

     练习:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下;

    cp -r /etc/[mnrp]*.conf /tmp/conf.d/

    IO重定向及管道

    IO即输入和输出设备,可用于输入的设备一般有键盘、文件系统上的常规文件、网卡等,可用于输出的设备有显示器、文件系统上的常规文件、网卡等;

    程序的三种数据流:

    输入的数据流:标准输入(stdin),键盘;

    输出的数据流:标准输出(stdout),显示器;

    错误的输出流:错误输出(stderr),显示器;

    文件描述符:fd,file descriptor

    标准输入:0

    标准输出:1

    错误输出:2

     IO重定向

    输出重定向:

    >    覆盖输出

    >>    追加输出

    小特性:

    set -C:禁止覆盖输出重定向至已存在的文件

    set +C:开启覆盖输出重定向至已存在的文件(默认)

    错误输出重定向:

    2>    覆盖输出

    2>>    追加输出

    合并正常输出流和错误输出流

    1.

    &>    覆盖输出

    &>>    追加输出

    2.

    COMMADN > /PATH/TO/somefile  2>&1 :如果命令执行成功则覆盖输出至somefile,执行不成功也覆盖输出至somefile

    COMMAND >> /PATH/TO/somefile 2>&1:如果命令执行成功则追加覆盖至somefile,执行不成功也追加输出至somefile

    注意:特殊设备:/dev/null  当不需要命令的执行结果,只需要知道命令的执行状态,则可以重定向至/dev/null,/dev/null相当于一个垃圾桶。

    输入重定向:<

    Here Document:<<,可以作为指定文件的结束符,常用于shell编程

    [root@localhost tmp]# cat <<EOF
    > how are you
    > my name is Frank
    > EOF
    how are you
    my name is Frank

     tr

    tr [OPTION]... SET1 [SET2]

    把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符,不修改原文件

    用法1: tr SET SET2 < /PATH/FROM/SOMEFILE  

     

    用法2:tr -d SET1  <  /PATH/FROM/SOMEFILE     删除SET1中的字符,区分大小写

     

    管道

    连接程序,实现将前面一个命令的输出直接定向后一个程序当做输出数据流

    COMMAND1 | COMMAND2 | COMMAND3 ...

    [root@localhost tmp]# echo 'abcd' | tr 'a-z' 'A-Z' | tr -d 'AD' 
    BC
    tee

     显示程序的输出并将其复制到一个或多个文件中

    [root@localhost tmp]# echo 'abcd' | tee /etc/fstab | tr 'ab' 'AB' 
    ABcd
    [root@localhost tmp]# cat /etc/fstab 
    abcd

     如上例子,使用tee命令输出到/etc/fstab,又将标准输入作为了后面tr的输入。

    命令hash

    当在bash下面执行一个命令的时候,bash会在PATH路径下去匹配相应的命令,如果你登录一次shell,执行了多次ls,bash每次都是去PATH路径下去找一次,岂不是很耗时间和资源吗?所以当你在登录shell之后,执行的每命令都会被缓存起来,这样你下次执行同一个命令的时候,就不需要又在PATH的路径下去寻找了,只需要在缓存里去找。当然这里的命令只针对外部命令,像cd这种内建在bash程序中的命令是不需要缓存的了。

    可以是hash查看当前shell进行缓存的命令(hash本身不会被缓存):

     常用选项:

     hash -d COMMAND:删除COMMAND

     

    hash -r:清空hash缓存

    变量

    什么是变量呢?变量就可以看成存储数据的容器。

    在bash变量的赋值和其他编程语言一样,使用:

    name=value

    [root@localhost /]# my_name="Frank"
    [root@localhost /]# echo ${my_name}
    Frank
    在bash中,变量是弱类型的,把所有的变量都看成是字符型,变量不需要事先声明,声明和赋值可以同时实现。
    变量引用使用${name}或者$name,建议使用加花括号的方式
    [root@localhost /]# my_name="Frank"
    [root@localhost /]# echo ${my_name}
    Frank
    [root@localhost /]# echo $my_name
    Frank

    变量名的定义规则

    1.变量名只能包含字母数字下划线,不能以数字开头

    2.不能够使用程序保留的关键字,如if,else

    3.变量名应该既简单和具有描述性

    bash变量类型

    本地变量:作用域仅为当前的shell

            变量赋值:name=value

            查看变量:set

            撤销变量:unset name

    环境变量:作用域为当前shell及其子进程

            变量赋值:

                    (1) export name=value    或者  name=value  再export name

                    (2) declare -x name=value  或者 name=value 再 declare -x name

            查看环境变量:export,declare -x ,printenv,env

            撤销环境变量:unset name
    在bash中内置了很多的环境变量,环境变量一般为大写,一般用于定义bash的工作环境,如PATH,HISTSIZE

    局部变量:作用域仅为某代码片段(函数上下文)

    位置参数变量:当执行脚本的shell进程传递的参数

    特殊变量:shell内置的有特殊功能的变量

    特殊变量如$?,返回上次命令执行的状态,0代表成功,1-255代表失败

    设置只读变量:

            declare -r name  或者 readonly name

    [root@localhost /]# name="Frank2"
    [root@localhost /]# 
    [root@localhost /]# declare -r name
    [root@localhost /]# echo ${name}
    Frank2

    只读变量无法被重新赋值,也不支持撤销,存活时间为当前shell进程的生命周期,随shell进行结束而终结

    多命令执行

    bash一行可以同时执行多个命令

    ~]# COMMAND1; COMMAND2; COMMAND3; ......

    [root@localhost /]# useradd frank1; useradd frank2
    [root@localhost /]# tail -2 /etc/passwd
    frank1:x:1203:1203::/home/frank1:/bin/bash
    frank2:x:1204:1204::/home/frank2:/bin/bash

    逻辑运算

    运算数:真(true,yes,on,1),假(false,no,off,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

    由路径运算,在bash中一个法则,为短路法则

    ~]#COMMAND1 && COMMAND2

    如果COMMNAD1为假,那么COMMAND2就不会执行了

    如果COMMAND1为真,那么COMMAND2必须执行

    ~]#COMMAND1 || COMMAND2

    如果COMMAND1为假,那么COMMAND2必须执行

    如果COMMAND2为真,那么COMMAND2不会执行

    举例:

    判断frank3是否存在,如果不存在则创建

    [root@localhost /]# id frank3 || useradd frank3
    id: frank3: no such user
    [root@localhost /]# tail -1 /etc/passwd
    frank3:x:1205:1205::/home/frank3:/bin/bash

    算术运算

    在bash中也可以执行算术运算:

    算术运算符:

    +:加

    -:减

    *:乘

    /:除

    **:幂运算

    %:取余

    算术运算格式:

    (1) let VAR=算术运算表达式

    [root@localhost ~]# let var=1+2
    [root@localhost ~]# echo ${var}
    3

    (2) VAR=$[算术运算表达式]

    [root@localhost ~]# number1=2
    [root@localhost ~]# number2=2
    [root@localhost ~]# var=$[$number1+$number2]
    [root@localhost ~]# echo ${var}
    4

    (3) VAR=$((算术运算表达式))

    [root@localhost ~]# number1=1
    [root@localhost ~]# number2=6
    [root@localhost ~]# var=$(($number1+number2))
    [root@localhost ~]# echo $var
    7

    (4)VAR=$(expr $ARG1 操作  $ARG2)

    [root@localhost ~]# number2=6
    [root@localhost ~]# number1=1
    [root@localhost ~]# 
    [root@localhost ~]# 
    [root@localhost ~]# var=$(expr $number1 + $number2)
    [root@localhost ~]# echo $var
    7

    expr也可以做数值比较,详见man expr

    [root@localhost ~]# var=$(expr $number1 = $number2)
    [root@localhost ~]# echo $var
    0

    bash的配置文件

    当我们登录shell进程的时候,会读取bash的配置文件,bash的配置文件非为两种,profile类和bashrc类,在讲这个之前,只有管理员才能修改bash的配置文件,我们先来了解一下下面两种登录类型:

    交互式登录shell进程:

    1.通过某终端输入账号和密码后登录打开的shell进程

    2.使用su命令,su - USERNAME或者使用su -l USERNAME登录shell进程

    非交互式登录shell基础:

    1.图形界面下打开的终端

    2.运行脚本时打开的shell

    3.su USERNAME执行的登录切换

    了解两种登录类型的时候,我们就来看看bash的两类配置文件,profile类和bashrc类

    profile类:

    profile类的文件有:/etc/profile   /etc/profile.d/*.sh    ~/.bash.profile

    全局作用:/etc/profile和/etc/profile.d/*.sh

    用户个人作用:~/.bash.rc

    主要作用:用于定义环境变量,运行命令或脚本

    bashrc类:

    bashrc类的文件有:/etc/bashrc    ~/.bashrc

    全局作用:/etc/bashrc

    用户个人作用:~/.bashrc

    主要作用:定义本地变量和命令的别名

    那么两种登录方式会读取哪些配置文件,读取时是按怎样的顺序呢?

    交互式登录shell进程:

    /etc/profile  -->  /etc/profile.d/*  -->  ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

    非交互式登录shell进程:

    ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*

    在前面命令行中定义变量的时候,我们会发现当我关闭shell进程的时候,再次登录的时候,之前定义的变量都没有了,所以在命令行中定义的变量的生命周期为当前shell进程的生命周期。

    如果在配置文件中定义,会出现什么样的情况呢?我们来试试,前面说bashrc是主要定义命令别名的,命令别名在~/.bashrc中存在:

    [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

    好的,我们就在文件写入alias cls='clear',写完之后保存退出,执行cls,我们会发现并没有成功,因为在配置文件中写入的只对随后新启动的shell进程有效

    让配置文件定义的特性立即生效的方法

    1.通过命令行重复定义一次

    2.让shell进程重读配置文件

    ~]#source  /PATH/FROM/CONFI_FILE

    或者

    ~]# .  /PATH/FROM/CONFI_FILE

    举个例子:让centos用户登录时,显示欢迎,并显示当前时间:

    分析:因为只是针对单个用户,我们只需要在其家目录下修改.bash_profiel文件

    echo "Hi centos!"
    echo `date`

    当用户登录时就会显示效果:

    更新历史:

    2017-7-18:更新了命令wc、sort、uniq、cut、diff和patch

           更新命令hash、变量、多命令执行,逻辑和算术运算和bash的配置文件

  • 相关阅读:
    线性DP
    2020年第十一届蓝桥杯第二场C/C++ B组省赛题解
    筛质数 + 质因子分解
    快速幂
    DP 背包问题
    CF510B Fox And Two Dots
    怎样看人生的价值和意义!--找回迷失的自己
    Ionic+AngularJS 开发的页面在微信公众号下显示不出来原因查究
    AngularJS directive 指令相关记录
    AngularJS的一点学习笔记
  • 原文地址:https://www.cnblogs.com/liubinsh/p/7141437.html
Copyright © 2011-2022 走看看