bash

前言

bash是Linux中默认的shell,通过bash及bash提供的工具我们可以很高效的使用Linux完成我们的工作,接下来让我们来学习学习bash。

1. Shell介绍

shell是一个程序,可以实现外部与内核的通信功能,通过shell我们可以控制内核完成一些复杂的工作,从而完成我们的任务。Linux中常见的shell有bash/bsh/ash/tsh/zsh/ksh等,其中bash是Linux中默认的shell,这些shell本质上差异不大,只是一些语法的实现上有些区别。因为bash是Linux默认的shell,而且bash确实功能强大,使用也方便,所以接下来我们主要来学习bash,不过shell也和编程类似,可以触类旁通。

2. bash特点

  1. history命令

    history命令会列出记录的所有bash命令!number:执行.bash_history文件中第n条命令!!:执行上一条命令!command:执行以command开头的最近的一条命令

bash下组合按键

ctrl+C:终止目前的命令

ctrl+D:输入结束(EOF)

ctrl+Z:暂停目前的命令

  1. 通配符

*:代表0到无穷多个任意字符

?:代表一定有一个任意字符

[]: 代表一定有一个在中括号内的字符(非任意字符),例如[abcd],代表一定有一个字符,可能是a,b,c,d这四个中任意一个

[-]:若有减号在中括号内,代表在编码顺序内的所有顺序,例如[0-9]代表0到9之间的所有数字

[^]:若中括号内的第一个字符为指数符号^,那表示原向选择,例如[ ^abc]代表一定有一个字符,只要是非a,b,c的其他字符就接受的意思

  1. bash其他符号

    #:注释符号,后面内容不执行

    \:转移符号

    |:管道符号,分隔两个管道命令的界定

    ~:用户的主文件夹

    ;:连续命令执行分隔符

    $:变量前导符

    &:作业控制,将命令变成背景下工作

    !:逻辑运算符非

    /:目录符号

** >,>> **:数据流重定向,分别是“替换”和“累加”,1>表示输出正确信息,2>表示输出错误信息,同时输出则为2>&1

<,<<:数据流重定向,输入导向

“:两个反单引号中间为先执行命令,也可使用$()

  1. 数据管理命令

    cut:对于比较规整的信息,cut可以截取每一行特定部分的字符

    grep:对输出结果进行查询筛选

    sort:对输入内容进行排序

    uniq:对输入去重的操作

    wc:对输入进行统计计数

    tee:同时将数据屏幕输出和保存到文件

    xargs:将输入通过空格符或者断行符分开作为参数

-的用途:有些命令需要用到文件名作为参数,可以用-代指srdout和stdin输出的文件名

awk: 编辑文档,方便列操作

paste: 合并文档,可以用’-d’指定分隔符

cat: 查看文档,也可以重定向成合并文档

  1. 正则表达式

字符集

[:alnum:]:代表英文大小写字符及数字,即0-9,A-Z,a-z

[:alpha:]:代表任何英文大小写字符,即A-Z,a-z

[:blank:]:代表空格键与[Tab]按键

[:cntrl:]:代表键盘上面的控制按键,即包括CR,LF,Tab,Del等

[:digit:]:代表数字字符,即0-9

[:graph:]:除了空格符(空格键与[Tab]按键)外的其他所有按键

[:lower:]:代表小写字符,即a-z

[:print:]:代表任何可以被打印出来的字符

[:punct:]:代表标点符号

[:upper:]:代表大写字符,即A-Z

[:space:]:任何会产生空白的字符,包括空格键[Tab]CR等

[:xdigit:]:代表十六进制的数字类型,因此包括0-9,A-F,a-f等


基础字符表达式与应用

.:代表一定有一个任意字符

:代表重复前一个0到无穷次

^word:待查找的字符串在行首

word$:待查找的字符串在行尾

[list]:从字符集合的RE字符里面找出想要选取的字符

[^list]:从字符集合的RE字符里面中找出不要的字符串或范围

[n1-n2]:从字符集合的RE字符里面找出想要选取的字符范围

[^$]:指定空白行

{n1,n2}:连续n到m个的前一个RE字符,若为{n}则是连续n个的前一个RE字符,若为{n,}则是连续n个以上的前一个RE字符


*
扩展的正则表达式**

+:重复一个或者一个以上的前一个RE字符

?:零个或者一个的前一个RE字符

|:用或(or)的方法找出数个字符串

():找出”组“字符串

()+:多个重复组的判别

  1. 文本工具
  • sed命令
    作用:sed本身是一个管道命令,可以分析stdin,还可以将数据进行替换、删除、新增、选取特定行的功能

    语法:sed [n1] [n2] function;function选项如下所示

  • a:新增,a后面可以接字符串,而这些字符串会在新的一行中出现
  • c:替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行
  • d:删除,因为是删除,所以d后面通常不接任何参数
  • i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现
  • p:打印,也就是将某一个选择的数据打印出来,通常p会与sed -n一起运行
  • s:替换,可以直接进行替换的工作,通常这个s的动作可以搭配正则表达式,例如1,20s/word1/word2/g,即将1到20行中word1替换成word2
  1. 文件比较工具
  • diff [-bBi] from-file to-file:比较from-file和to-file的差别,注意不要用diff命令去比较不相干的文件,这样没有比较的结果
  • cmp [-s] file1 file2:比较file1和file2,返回第一个发现的不同点字节处和行数

3. bash理解

在翻看了许多资料之后,对于bash的理解又有了新的进步。bash是一个默认的shell,当我们进入Linux系统是,Linux就会给每一个账户分配一个shell,因此,当我们开始进入了以后,就是已经开始在使用bash了,原本我以为是只在调用bash的时候才使用,没想到bash一直都是我工作的环境,正是在这个环境下,我们能够方便的使用上下键查看历史命令、使用tab键补全路径、还有直接使用grep、awk、sed等这些工具进行工作等等,还有数据重定向、命令管道符等等,非常的方便,bash果然是非常实用、好用。

如果需要切换shell的话,也是可以的,可以有如下操作:

  1. 方法一: chsh -s /bin/ksh
  2. 方法二: usermod -s /bin/ksh root
  3. 查看当前shell:echo $SHELL或者egrep ‘root’ /etc/passwd
  4. 查看所有shell:cat /etc/shells或者chsh -l
# bash