我们知道Linux系统有两种操作方式,一种为GUI的图形界面化管理方式,其中图形程序常见的有Gnome、KDE、xfce;另一种管理方式就是就是GLI的命令行管理方式,而命令行的管理方式就是通过shell程序来进行管理,而shell程序则分为多种,我们这节就来详细介绍shell程序;

bash程序及其特性

  shell程序在Linux系统下的分类:通过cat /etc/shells查看系统所支持的shell程序;

  CLI命令行管理下,我们包含sh、bash(Linux系统的默认shell程序,和sh是链接关系)、csh、ksh(csh的加强版,它是商业化的产品,需要服务)、tcsh(csh的开源版本)、zsh(终极shell程序,比之前的shell程序都要强大)

  【红帽系统的和众多Linux发行商的shell层序默认都是bash】

  shell程序运行起来后,就是一个独立的进程,用来关联或者管理控制其他的程序;同时shell层序可以同时运行多个,而且多个shell层序之间可以嵌套,且shell程序之间相互独立,说白了,就是shell-1不知道有shell-2的存在,不管他们之间存在什么样的关系;

  pstree  #查看进程树,这个内容在我们详细介绍进程的时候再说;

  此时,我们的命令行控制界面就在最后一个bash程序中,而在这个程序里面所执行的命令或者修改的参数,与其他的shell程序(上一级的bash或则上上级的bash)是无关的;

  通过配置exit退出当前的bash;

  用户的工作环境:

    在bash程序中,除了root用户工作在“#”下,其他的bash程序下的工作环境都是一样的“$”,而他们之间的shell程序有一定的关联,这里我们仔细介绍下(root用户与普通用户的关联--环境参数):

    首先,我要明白站在用户角度来说,shell分为两种类型:1、登录式的shell  2、非登录式的shell;登录式的shell也就是通过终端ssh或者telnet,或者通过su - USERNAME切换过去的,都叫做登录式的shell层序;而非登录式的shell为图形界面下的teminal打开的管理窗口,以及su USERNAME切换过来的就叫做非登录式的shell;

    了解他们两则的区别之前,我们先了解一些文件:/etc/profile,/etc/profile.d/*.sh,/etc/bashrc(这些文件是全局配置文件),以及~/.bash_profile,~/.bashrc(这些文件都时在用户的家目录下,为个人配置文件)

    同时,根据文件类型可以将以上文件分为:1、profile文件  2、bashrc文件;profile文件用来定义环境变量,在/etc/profile里面配置,或者生成一个新的sh文件放在/etc/profile.d/目录下,如果配置文件只写在~/.bash_profile下,则只在个人shell程序下生效;bashrc类文件一般用来设置本地变量,定义命令的别名(alias);

    在登录shell的时候需要加载这些配置文件的内容,而加载的顺序或者优先级是怎么样的呢?

    对于登录式的shell程序读取配置文件的顺序如下:/etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile-->~/.bashrc-->/etc/bashrc

    对于非登录式的shell程序读取配置文件的顺序如下:~/.bashrc-->/etc/bashrc-->/etc/profile.d/*.sh

    如上图:在hive用户的~/.bash_profile文件下修改的登录参数,登录hive的shell的程序的时候就会运行这个echo命令;

bash的特性

  1、命令历史

  history  带着行号显示过去执行的所有命令

    上图显示,history为一个内部命令,所以可以通过help history来寻找帮助;

    -c  清空整个命令历史

    -d  删除指定编号的命令历史

      history -d 500   #删除第500行命令历史

      history -d 500 10  #删除从500行命令历史向下数10条来删除

    一般来说,history保存的命令都存放在~/.bash_history文件中,所以下次登录的时候已让能看到这个命令的历史记录,这个保存过程一般是自动进行,如果想要手动保存,就是-w参数来进行这个操作;

      history -w

    同时,我们通过printenv | gerp -i histsize,能够查看到history的环境变量HISTSIZE,用来记录我们的命令历史保存的最大条目数;

  history除了用来读取命令历史外,还可以用来调用历史命令。我们知道,通过上下键可以读取之前敲过的命令,但是如果命令执行的太过于靠前,就需要桥很多次上键,这样就比较累,这时候我们通过history的小技巧来执行过去执行过命令:

    !n  #n代表history查看到的前面数值,这句话代表执行第n条命令;

    !-n  #代表从最后一个命令数起,执行第倒数第n条命令;

    !!  #代表执行上一条命令,和“上”键相同;

    !string  #!加上字符串,匹配最近一次执行的命令

    !$  #应用上一个命令的最后一个参数(传参!)

  2、管道与重定向【次内容我们后面的文章会和正则表达式一起专门介绍】

  3、命令别名

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

  在shell中定义的别名仅仅在当前shell生命周期中有效,别名的有效范围也仅为当前的shell进程;想要永久有效,就需要将alias命令写在bash的程序文件中区才行,也就是/etc/profile、/etc/bashrc、/etc/profile.d/*.sh等文件;

  如果不想使用这个命令了,既可以通过unalias来删除定义的别名;

  4、命令行编辑

  命令光标跳转:

    ctrl+a  跳到命令行行首

    ctrl+e  跳到命令行行尾

    ctrl+d  删除光标所在字符(单个字符)

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

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

    ctrl+l  clear清屏命令

  5、命令行补全

  Linux下命令行补全分为两种:一种为路径补全,一种为命令补全;这两者都是通过tab键来实现;

  命令补全:PATH环境在设定正常的情况下,无法补全的,可能是错误命令,或者所敲的命令不再PATH路径中,或者string不是唯一的,这时候通过连续敲击两下tab键会有命令提示;

  路劲补全:cd /etc/sysc  同样使用tab键来进行补全;路径补全和命令补全用法相同,只是找的内容不同,命令补全是寻找PATH环境变量下的命令文件,而路径补全所找的是当前文件;

  6、文件名通配符

  文件名统配:*  匹配任意长度的任意字符;?  匹配任意的单个字符;[]  匹配范围内的单个字符;[^]  匹配范围之外的任意单个字符;

    ls a*  #查看以a开头的文件

    ls a*3  #查看以a开头以3结尾的文件

    ls ?y*  #查看以任意一个字符开头,后面接y,之后任意字符任意长度的文件

    ls [a-zA-Z]*[0-9]  #查看以字母开头(包含大小写)以数字结尾的文件

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

      以上表示也可以通过 [:字符类型:] 的方式来表示:[:space:]空格符 [:punct:]标点 [:lower:]小写字符 [:upper:]大写字母 [:alpha:]大小写字母 [:digit:]数字 [:alnum:]数字和字母集合,通过man 7 glob可以获取以上信息;

      如果要调用上面的特定字符还需要添加一个[],这个[]才表示“类”--[[:字符类型:]];

    ls [[:alpha:]]*[[:alpha:]]  #字母开头,字母结束的文件

    ls[[:alpha:]]*[[:space:]]*[[:alpha:]]  #字母开头,字母结束,同时中间有空格符的文件

  7、支持使用的变量

  命令替换:把命令中的某个子命令替换为其执行结果的过程$()或者``(反引号),类似于参数来进行调用;

  【bash程序支持三种引号:“”双引号为弱引用,‘’单引号为强引用(说白了就是不做替换,输入是什么输出就是什么),而``反引号为命令替换】

  8、支持编辑,也就是shell脚本(这是bash的重要特性,这点我们之后会详细说到)

04 bash程序的基本特性的更多相关文章

  1. 004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构

    004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构 Java程序的结构 Java程序外层--类 程序外层,如下面的代码,是一个类的定义. c ...

  2. 黑马程序员——Objective-c特性

    1. 继承  Objective-c不支持多继承. Super 关键字:调用该类的父类: 超类:父类的另一种说法. 2.自定义NSLog()输出: 在类中添加description方法就可以自定义NS ...

  3. Linux上bash的部分基础特性:

    命令补全: tab shell程序在接收到用户执行命令的请求,分析完成后,最左侧的字符串会被当做命令 命令查找机制: 查找内部命令: 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名 ...

  4. ubuntu12.04添加程序启动器到Dash Home

    ubuntu12.04 dash home中每个图标对应/usr/share/applications当中的一个配置文件(文件名后缀为.desktop).所以要在dash home中添加一个自定义程序 ...

  5. 【scala】应用程序和App特性

    一.应用程序 要运行一个Scala对象,必须提供一个独立对象的名称.这个独立对象需要包含一个main方法,该方法接受一个Array[String]作为参数,结果类型为Unit. import Chec ...

  6. 【微信小程序+ES6新特性应用】字符串模板:美元符号$+大括号{}变量的写法

    1.字符串模板简介 ES6新特性中的字符串模板允许使用英文字符抑音符号`(提示:这里我们不能将其理解为单引号)来创建字符串,并且在该字符串中可以包含都[美元符号+大括号]包裹的变量 格式:consol ...

  7. ubuntu12.04 添加程序启动器

    方法: 1. 在/usr/share/applications目录下创建eclipse启动器配置文件 cd /usr/share/applications vim eclipse.desktop 2. ...

  8. AJ学IOS 之微博项目实战(7)程序启动新特性用UICollectionViewController实现

    AJ分享,必须精品 一:效果 这里实现了大多数app都会有的软件新特性的功能,用的是UICollectionViewController实现的 二:思路 这里用了UICollectionViewCon ...

  9. linux之eval用法(高级bash程序员的必修之技)

    1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe=&qu ...

随机推荐

  1. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  2. 我发起了一个 支持 PostgreSql 的 外围设施 的 .Net 开源项目

    目标 :  让 PostgreSql 成为 通用的 跨平台 的 数据库 , 成为 开发者 喜爱 的 利器 . 要做的事 , 当然 , PostgreSql 本身现在不用我们去做什么 . 一个 数据库 ...

  3. Java多线程知识总结(一)

    一.创建线程的三种方式: 创建线程的方式有三种,一是创建Thread实例,二是实现Runnable接口,三是实现Callable接口,Runnable接口和Callable接口的区别是一个无返回值,一 ...

  4. tomcat源码阅读之默认连接器

    默认连接器 一.UML图: 1.所有的连接器都要实现Connector接口,必须创建Request对象和Response对象,httpConnector作为默认连接器,肯定也是要实现Connector ...

  5. MySQL通过Navicat实现远程连接

    直接使用Navicat通过IP连接会报各种错误,例如:Error 1130: Host '192.168.1.80' is not allowed to connect to this MySQL s ...

  6. 十二、springboot(七)打包启动

    1.打包 mvn clean package -Dmaven.test.skip=true2.运行 a.不能后台运行 java -jar 项目.jar     b.可后台运行        java ...

  7. 解决Ecipse和搜狗输入法快捷键冲突问题

    非常简单,关闭掉搜狗输入的所有快捷键!

  8. Flume 概述+环境配置+监听Hive日志信息并写入到hdfs

    Flume介绍Flume是Apache基金会组织的一个提供的高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供 ...

  9. 在本机将本机的ip和mac绑定

    cmd命令框中输入arp -s ip mac即可绑定 解除绑定:arp -d ip

  10. android利用provider查询同一个数据库中没有对外暴露出来的表

    [原创]转载请加本篇博客地址http://www.cnblogs.com/scarecrow-blog/p/6266042.html 个人感觉这是android provider 的一个漏洞, 废话少 ...