zoukankan      html  css  js  c++  java
  • bash特性

    bash特性一:命令历史:

    shell进程会在其会话中保存此前用户提交执行过的命令:
    history
    定制history的功能,可通过命令历史相关环境变量实现:

    • HISTSIZE:命令历史记录的条数
    • HISTFILE:指定历史文件,默认为~/.bash_history
    • HISTFILESIZE:命令历史文件记录历史的条数

    history命令用法:

    history [-c] [-d offset] [n]
    history -anrw [filename]
    history -ps arg [arg...]
    -c: 清空命令历史
    -d offset: 删除历史中指定的第offset个命令
     n: 显示最近的n条历史
    -a: 追加本次会话新执行的命令历史列表至历史文件
    -r: 读历史文件附加到历史列表
    -w: 保存历史列表到指定的历史文件
    -n: 读历史文件中未读过的行到历史列表
    -p: 展开历史参数成多行,但不存在历史列表中
    -s: 展开历史参数成一行,附加在历史列表后  
     !!:执行上一条命令
    string 重复前一个以“string”开头的命令
    !?string 重复前一个包含string的命令
    !string:p 仅打印命令历史,而不执行
    !$:p 打印输出 !$ (上一条命令的最后一个参数)的内容
    !*:p 打印输出 !*(上一条命令的所有参数)的内容
    ^string 删除上一条命令中的第一个string
    ^string1^string2 将上一条命令中的第一个string1替换为string2
    !:gs/string1/string2 将上一条命令中所有的string1都替换为 string2
    使用up(向上)和down(向下)键来上下浏览从前输入的命令
    ctrl-r来在命令历史中搜索命令
    (reverse-i-search)`’:
    Ctrl+g:从历史搜索模式退出
    要重新调用前一个命令中最后一个参数:
    !$ 表示
    Esc, .(点击Esc键后松开,然后点击 . 键)
    Alt+ .(按住Alt键的同时点击 . 键) 

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

    环境变量:HISTCONTROL

    • ignoredups 默认,忽略重复的命令,连续且相同为“重复”
    • ignorespace 忽略所有以空白开头的命令
    • ignoreboth 相当于ignoredups, ignorespace的组合
    • export 变量名="值“
    • 存放在 /etc/profile 或 ~/.bash_profile

    bash特性二:tab补全功能:

    命令补全:

    1)查找内部命令;
    2)查找外部命令:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给定命令名命名的文件;
    第一次找到的命令即为要执行的命令,用户给定的字符串只有一条惟一对应的命令,直接补全,否则,再次Tab会给出列表。

    [root@centos7~]#echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin   目前以后的PATH变量路径
    [root@centos7~]#wh  输入wh后按tab键,如果唯一就会补全,不唯一再按tab键就会显示多个命令
    whatis    whereis   which     while     whiptail  who       whoami 

    bash特性三:命令行展开:

    • ~:自动展开为用户的家目录,或指定的用户的家目录;
    • 可承载一个以,分隔的路径列表,并将其进行展开为多个路径。
    [root@centos7data]#mkdir -p test{1,2}/{a,b{x,y}}
    [root@centos7data]#tree
    .
    ├── test1
    │   ├── a
    │   ├── bx
    │   └── by
    └── test2
        ├── a
        ├── bx
        └── by
    通过tree能够展示当前data目录下有多少个子目录。
    

    bash特性四:历史命令执行的结果状态

    bash通过状态返回值来输出此结果:    
    成功:0 失败:1-255 命令执行完成之后,其状态返回值保存于bash的特殊变量$?中; 命令正常执行及其功能不同,结果各不相同; 引用命令的执行结果: $(command),如:mkdir $(date +%H-%M-%S),即引用date运行结果来执行命令,即创建date运行结果得到的数值的文件夹 'command'
    [root@centos7data]#date    当命令执行正确时
    Sun Oct 27 21:01:14 CST 2019
    [root@centos7data]#echo $?   
    0                          echo $?就会显示0,默认命令执行状态正确   
    [root@centos7data]#date -sss  当命令输入错误时
    date: invalid date ‘ss’
    [root@centos7data]#echo $?
    1                         echo $? 执行结果就是1,表示当前命令执行状态错误
    

    bash特性五:引用:

    • 强引用:'  '
    • 弱引用:" "
    • 命令引用:` `;不建议使用:尽量使用$(cmd)
    [root@centos7~]#echo "$PATH"   弱引用,可以识别到里边的命令变量
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@centos7~]#echo '$PATH'  强引用就会将里边的命令当初字符串进行打印
    $PATH
    [root@centos7~]#echo `echo $PATH`  反向单引号,引用命令,因此需要echo $PATH完整的命令才行,才会进行正确打印
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

    bash特性六:快捷键

    • Ctrl + l  清屏,相当于clear命令
    • Ctrl + s  阻止屏幕输出,锁定
    • Ctrl + q  允许屏幕输出
    • Ctrl + c  终止命令
    • Ctrl + z  挂起命令
    • Ctrl + a  光标移到命令行首,相当于Home
    • Ctrl + e  光标移到命令行尾,相当于End
    • Ctrl + u  从光标处删除至命令行首
    • Ctrl + k  从光标处删除至命令行尾
    • Alt + r 删除当前整行

    注意:Alt组合快捷键经常和其它软件冲突

    bash特性七:别名

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

    定义别名NAME,其相当于执行命令VALUE:

    • alias NAME='VALUE'

    在命令行中定义的别名,仅对当前shell进程有效;

    如果想永久有效,要定义在配置文件中

    仅对当前用户:~/.bashrc

    对所有用户有效:/etc/bashrc

    bash特性八:通配符

    * 匹配零个或多个字符
    
    ? 匹配任何单个字符
    
    ~ 当前用户家目录
    
    ~mage 用户mage家目录
    
    ~+ 当前工作目录
    
    ~- 前一个工作目录
    [0-9] 匹配数字范围 [a-z]:小写字母 [A-Z]:大写字母 [wang] 匹配列表中的任何的一个字符 [^wang] 匹配列表中的所有字符以外的字符

    预定义的字符类:man 7 glob

    [[:upper:]]匹配任意大写字母
    
    [[:lower:]]匹配任意小写字母
    
    [[:alpha:]]匹配所有字母
    
    [[:digit:]]匹配所有数字
    
    [[:alnum:]]匹配所有的字母和数字
    
    [[:space:]]匹配所有空白字符
    
    [[:punct:]]匹配所有标点符号
    [^]:匹配指定范围外的任意单个字符:
     [^[:upper:]]除大写字母以外任意字符
     [^[:lower:]]除小写字母以外任意字符
     [^[:alpha:]]除字母以外任意字符
     [^[:digit:]]除数字以外任意字符,或者[^0-9]
     [^[]:alnum:]除字母和数字以外的任意字符(即符号)
     [^[:space:]]匹配所有空白字符
    
    [root@centos7data]#ls [^[:digit:]]*[0-9] -d   显示以非数字开头以数字结尾的文件
    test1  test2
    

    bash特性九:标准I/O和管道

    标准输入和输出

    程序:指令+数据
      读入数据:Input
      输出数据:Output
    打开的文件都有一个fd: file descriptor (文件描述符)
    Linux给程序提供三种I/O设备
    标准输入(STDIN)-0 默认接受来自键盘的输入
    标准输出(STDOUT)-1 默认输出到终端窗口
    标准错误(STDERR)-2 默认输出到终端窗口
    I/O重定向:改变默认位置
    

    IO重定向

    STDOUT和STDERR可以被重定向到文件
    命令 操作符号 文件名
    支持的操作符号包括:
    1)>  把STDOUT重定向到文件
    2)2> 把STDERR重定向到文件
    3)&> 把所有输出重定向到文件
    > 文件内容会被覆盖
    [root@centos7data]#echo 22 > f1
    [root@centos7data]#cat f1
    22
    set –C 禁止将内容覆盖已有文件,但可追加
    >| file 强制覆盖
    [root@centos7data]#echo aa >| f1
    [root@centos7data]#cat f1
    aa
    set +C 允许覆盖
    >> 原有内容基础上,追加内容
    

    输出流重定向:>>  

    追加输出:
    [root@centos7data]#cat f1 aa [root@centos7data]#ls /data/ >> f1 [root@centos7data]#cat f1 aa f1 scripts

    错误输出流重定向:

    [root@centos7data]#cat f11  2> f2  错误输出
    [root@centos7data]#cat f22 2>> f2  错误追加
    [root@centos7data]#cat f2
    cat: f11: No such file or directory
    cat: f22: No such file or directory
    

    合并标准、错误输出流:

    [root@centos7data]#ls /boot /dir  &> f2  第一种写法对的错的放一起
    [root@centos7data]#cat f2
    ls: cannot access /dir: No such file or directory
    /boot:
    config-3.10.0-957.el7.x86_64
    
    [root@centos7data]#ls /boot /dir > f2  2>&1  正确的的放入f2,标准错误放入正确里
    [root@centos7data]#cat f2
    ls: cannot access /dir: No such file or directory
    /boot:
    config-3.10.0-957.el7.x86_64
    
    [root@centos7data]#ls /boot /dir 2>&1 > f2  错误的放入标准输出,此时已经打印在屏幕里,然后才把正确的放进f2  此写法错误
    ls: cannot access /dir: No such file or directory
    [root@centos7data]#cat f2
    /boot:
    config-3.10.0-957.el7.x86_64
    
    [root@centos7data]#ls /boot /dir 2> f2 1>&2  错误的放进f2里,正确的放入错误里
    [root@centos7data]#cat f2
    ls: cannot access /dir: No such file or directory
    /boot:
    config-3.10.0-957.el7.x86_64

    输入重定向:< 

    [root@centos7data]#cat > f1
    2*3
    2^3
    ^C
    [root@centos7data]#bc <f1
    6
    8
    [root@centos7data]#bc <f1 > f2  将f1文件内容传到bc然后再传给f2
    [root@centos7data]#cat f2
    6
    8
    [root@centos7data]#cat < f1
    2*3
    2^3
    [root@centos7data]#cat < f1 >f3  将f1显示的内容再传给f3
    [root@centos7data]#cat f3
    2*3
    2^3

    tr命令
    tr 转换和删除字符
    tr [OPTION]... SET1 [SET2]
    选项:

    -c --complement:取字符集的补集
    -d --delete:删除所有属于第一字符集的字符
    -s --squeeze-repeats:把连续重复的字符以单独一个字符表示
    -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
    [:alnum:]:字母和数字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符
    [:digit:]:数字 [:graph:]:图形字符 [:lower:]:小写字母 [:print:]:可打印字符
    [:punct:]:标点符号 [:space:]:空白字符 [:upper:]:大写字母
    [:xdigit:]:十六进制字符
    

    示例:

    [root@centos7data]#tr 'a-z' 'A-Z' < /etc/issue > f2   将/etc/issue的配置文件转换为大写
    [root@centos7data]#cat f2
    S
    KERNEL R ON AN M
    

    多行重定向:

    [root@centos7data]#cat > f1 <<EOF  将内容多行重定向
    > aaa
    > ddd
    > ccc
    > sss
    > EOF  最后以EOF结束
    [root@centos7data]#cat f1
    aaa
    ddd
    ccc
    sss
    
    [root@centos7data]#cat > f1 << EOF
    > My hostname is `hostname`
    > My username is `uname -r`
    > EOF
    [root@centos7data]#cat f1
    My hostname is centos7.localdomain
    My username is 3.10.0-957.el7.x86_64
    
    [root@centos7data]#mail -s "1st mail" root << EOF
    > hello 
    > who are you
    > your name
    > EOF
    [root@centos7data]#mail
    Heirloom Mail version 12.5 7/5/10.  Type ? for help.
    "/var/spool/mail/root": 1 message 1 new
    >N  1 root                  Sun Nov  3 21:48  20/617   "1st mail"
    & 1
    Message  1:
    From root@centos7.localdomain  Sun Nov  3 21:48:04 2019
    Return-Path: <root@centos7.localdomain>
    X-Original-To: root
    Delivered-To: root@centos7.localdomain
    Date: Sun, 03 Nov 2019 21:48:04 +0800
    To: root@centos7.localdomain
    Subject: 1st mail
    User-Agent: Heirloom mailx 12.5 7/5/10
    Content-Type: text/plain; charset=us-ascii
    From: root@centos7.localdomain (root)
    Status: R
    
    hello 
    who are you
    your name
    
    & quit
    Held 1 message in /var/spool/mail/root
    

    管道:

    [root@centos7data]#whoami | tr 'a-z' 'A-Z'
    ROOT
    
    [root@centos7data]#echo {1..100} |tr ' ' '+'|bc
    5050
    
    [root@centos7data]#ls /data /error 2>&1 | tr 'a-z' 'A-Z' 对的错的全部导入,并转换为大写字母
    LS: CANNOT ACCESS /ERROR: NO SUCH FILE OR DIRECTORY
    /DATA:
    [A-Z]
    BC
    F1
    F2
    F3
    SCRIPTS
    TR
    
    [root@centos7data]#ls /data /error   |&  tr 'a-z' 'A-Z'   这种写法慎重
    LS: CANNOT ACCESS /ERROR: NO SUCH FILE OR DIRECTORY
    /DATA:
    1
    2
    [A-Z]
    BC
    F1
    F2
    F3
    SCRIPTS
    TR
    

    less :一页一页地查看输入

    ls -l /etc | less

    mail: 通过电子邮件发送输入

    -b<地址>:指定密件副本的收信人地址;
    -c<地址>:指定副本的收信人地址;
    -f<邮件文件>:读取指定邮件文件中的邮件;
    -i:不显示终端发出的信息;
    -I:使用互动模式;
    -n:程序使用时,不使用mail.rc文件中的设置;
    -N:阅读邮件时,不显示邮件的标题;
    -s<邮件主题>:指定邮件的主题;
    -u<用户帐号>:读取指定用户的邮件;
    -v:执行时,显示详细的信息。
    echo "test email" | mail -s "test" wang  

    echo输入的命令,-s表示邮件的主题,后面的admin@linuxde.net则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。当邮件正文输入完成后,需要按CTRL+D结束输入,此时会提示你输入Cc地址,即邮件抄送地址,没有直接回车就完成了邮件的发送。

    echo "hello,this is the content of mail.welcome to www.linuxde.net" | mail -s "Hello from linuxde.net by pipe" admin@linuxde.net

    管道中 - 符号
    示例:
    将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,
    经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取
    前一个命令的 stdout, 因此,就不需要使用临时file了

    tar -cvf - /home | tar -xvf -   前面的-和后面的-文件名一致
    

    重定向到多个目标(tee)
    命令1 | tee [-a ] 文件名 | 命令2
    既将命令的打印结果显示出来,又保存到当前的文件中
    -a 追加

    使用:
    1)保存不同阶段的输出
    2)复杂管道的故障排除
    3)同时查看和记录输出

    [root@centos7data]#uname -r | tee /data/log   将显示的内容在屏幕上显示并保存到log文件中
    3.10.0-957.el7.x86_64
    [root@centos7data]#cat log
    3.10.0-957.el7.x86_64
    

     小练习:处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格 

     [root@centos7data]#echo 'xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4' | tr -dc '[0-9 ]'   前面内容有!#,需要用单引号引起来,才能识别里边的内容
     1  2  3  4
    

      

     

     

      

     

      

      

  • 相关阅读:
    图的概述
    "《算法导论》之‘排序’":线性时间排序
    “《算法导论》之‘查找’”:散列表
    如何使用VS2013本地C++单元测试框架
    “《算法导论》之‘查找’”:顺序查找和二分查找
    查找算法概述
    第二部分 位运算符、赋值运算符、三元及一元运算符和语句分类
    LINQ 的查询_联表、分组、排序
    第二部分 关系与比较运算符 、 自增与自减运算符、条件逻辑运算符
    LINQ to Sql系列一 增,删,改
  • 原文地址:https://www.cnblogs.com/struggle-1216/p/11749172.html
Copyright © 2011-2022 走看看