码迷,mamicode.com
首页 > 系统相关 > 详细

初识shell

时间:2016-01-20 06:31:41      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:计算机硬件   windows   操作系统   linux   朋友   

shell为何物?

        相信只要摸过计算机,对于操作系统 (不论是 Linux 、 Unix 或者是 Windows) 有点概念的朋友们大多听过这个名词,因为只要有操作系统,那么就离不开 Shell 这个东西。Linux 的管理常常需要透过远程联机,而联机时文字接口的传输速度一定比较快, 而且,较不容易出现断线或者是信息外流的问题。管理整个计算机硬件的其实是操作系统的核心 (kernel),这个核心是需要被保护的。 所以我们一般使用者就只能透过 shell 来跟核心沟通,以让核心达到我们所想要达到的工作。

       说通俗些:shell就是负责与系统核心kernel进行通信的一个接口工具,通过与核心通信达到用户所想要达到的结果。

Linux下的shell

       在早年的 Unix 年代,发展者众多,所以由于 shell 依据发展者的不同就有许多的版本,例如常听到的 Bourne SHell (sh) 、在 Sun 里头默认的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本就称为『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本,也是基准于 GNU 的架构下发展出来的。

cat /etc/shells     --查看系统中存在的shell
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/zsh

       /bin/bash 是 Linux 默认的 shell ,那为什么我们系统上合法的 shell 要写入 /etc/shells 这个文件呢? 这是因为系统某些服务在运行过程中,去检查使用者能够会使用的 shells ,而这些 shell 的查询就是基于 /etc/shells 这个文件。bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux 发行版的标准 shell 。 bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本。bash 主要的优点有如下几个方面:

命令历史记录history

       我们可以通过在命令列按『上下键』来找到前或后一个输入的命令,默认的命令记忆功能可以到达 1000 个。也就是说, 你曾经输入过的命令几乎都被记录下来了。这么多的命令记录均保存在你的家目录内的 .bash_history文件里。 需要留意的是 ~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中。

Tab键命令补全

       如果我想要知道我的环境中可以运行的命令有几个,可直接在 bash 的提示字符后面连续按两次 [Tab] 按键就能够显示所有的可运行命令了。那如果想要知道系统当中所有以 c 为开头的命令咋弄呢?就按下『 c[Tab][Tab] 』就好。

给命令起别名

       假如我需要知道这个目录底下的所有文件 (包含隐藏档) 及所有的文件属性,那么我就必须要下达『 ls -al 』这样的命令,是否觉得麻烦,有没有更快的取代方式?这时就需要使用命令别名了。如alias la=‘ls –al’,则运行la相当于执行了ls –al这个命令。

工作管理job control,fg,bg

       使用前后、后台的控制可以让工作进行的更为顺利。至于工作控制(jobs)的用途则更广, 可以让我们随时将工作丢到背景中运行,而不用担心用了 [Ctrl] + c 来停掉该程序。此外,也可以在单一登录的环境中,达到多任务的目的。

程序化脚本shell scripts

       在 Linux 底下的 shell scripts 可以将你平时管理系统常需要下达的连续命令写成一个文件, 该文件并且可以透过对谈交互式的方式来进行主机的侦测工作,也可以基于shell 提供的环境变量及相关命令来进行设计。以前在 DOS 底下需要程序语言才能写的东西,在 Linux 底下使用简单的 shell scripts 就可以帮你达成。

通配符

       除了完整的字符串之外, bash 还支持许多的通配符来帮助用户查询与执行命令。 举例来说,想要知道 /usr/bin 底下有多少以 X 为开头的文件使用『 ls -l /usr/bin/X* 』就知道了。

shell 变量功能

       变量是 bash 环境中非常重要的一个功能,我们知道 Linux 是多用户多任务的环境,每个用户登陆系统都能取得一个 bash , 每个人都能够使用 bash 下达某个命令来达到既定的目的,可问题是, bash 是如何得知同一个命令执行的不同结果呢?这就需要『变量』了。

      你可以利用 echo 这个命令来取用变量, 但是,变量在被取用时,前面必须要加上『 $ 』才行,举例来说,要知道 PATH 的内容,需 echo $PATH 或 echo ${PATH}。

      创建一个自定义的变量 echo $mypath,此时如果执行,结果是空的,执行 mypath=/usr/bin/mypath,再 echo $mypath,会出现 =/usr/bin/mypath。通过等号=对变量进行了赋值。下面就来列举下常用的配置的规则:

  1. 变量与变量内容以一个等号『=』来连结;
  2. 等号两边不能直接接空格符,如 『mypath=   /usr/bin/mypath』或『mypath=/usr/bin   /mypath』为错误;
  3. 变量名称只能是英文字母与数字与下划线,开头字符不能是数字;
  4. 变量内容若有空格符可使用双引号『"』或单引号『‘』将变量内容引用起来,但双引号内的特殊字符如 $ 等,可以保有原本的特性,如『var="lang is $LANG"』则『echo $var』可得『lang is en_US』;单引号内的特殊字符则仅为一般字符 (纯文本),如『var=‘lang is $LANG‘』则『echo $var』可得『lang is $LANG』;
  5. 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, ‘等)变成一般字符;
  6. 在一串命令中,还需要引用其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。如想要取得系统核心版本信息『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』;
  7. 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如『PATH="$PATH":/usr/bin』;
  8. 若该变量需要在其他子程序运行,则需要以 export 来使变量变成全局环境变量:『export PATH』,这时全局变量并没有及时生效,需要bash
  9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 ;
  10. 取消变量的方法可用 unset :『unset 变量名称』。例如取消 mypath的配置:『unset mypath』。

  使用 env 查看系统的环境变量及其说明:env 是 environment (环境) 的简写,可以列出系统中存在的所有环境变量,export 也可以实现这个功能。如下就介绍下几个常用的环境变量:

  • HOME
    代表用户的家目录。我们可以使用 cd ~ 去到自己的家目录,或者利用 cd 就可以直接回到用户家目录。
  • SHELL
    告知我们,目前这个环境使用的 SHELL 是哪支程序? Linux 默认使用 /bin/bash 的。
  • HISTSIZE
    这个与『历史命令 history』有关,我们曾经下达过的命令可以被系统记录下来,而记录的数量则是由这个值来配置的。
  • MAIL
    当我们使用 mail 这个命令在收信时,系统会去读取的邮件信箱文件 (mailbox)。
  • PATH
    运行文件搜寻的路径,目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是很重要的。
  • LANG
    语系编码数据,当我们在启动某些 perl 的程序语言文件时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能会产生错误。一般来说,我们中文编码通常是 zh_CN.UTF-8。
  • RANDOM
    随机随机数的变量,目前大多数的发行版都会有随机数生成器,那就是 /dev/random 这个文件。 我们可以透过这个随机数文件相关的变量 ($RANDOM) 来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。如我想要使用 0~9 之间的数值则可利用 declare 指定数值类型即可实现。


   使用 set 查看所有变量 (含环境变量与自定义变量)

   bash 可不只有环境变量喔,还有一些与 bash 操作接口有关的变量,以及用户自己定义的变量存在的。set命令除了可现实环境变量外,还会将其他在 bash 内的变量全部显示出来。如下就介绍下几个:

      [root@dyqd2011 ~]# set

      BASH=/bin/bash            <== bash 的主程序放置路径

      BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-                           linux-gnu")                     <== bash 的版本

      BASH_VERSION=‘4.1.2(1)-release‘              <== 也是 bash 的版本

      COLORS=/etc/DIR_COLORS                        <== 使用的颜色记录文件

      COLUMNS=80                 <== 在目前的终端机环境下,使用的字段有几个字符长度

      HISTFILE=/root/.bash_history             <== 历史命令记录的放置文件

      HISTFILESIZE=1000            <== 历史命令记录的最大数

      HISTSIZE=1000                  <== 目前环境下,可记录的历史命令最大笔数

      HOME=/root                 <== 家目录
      HOSTNAME=dyqd2011             <== 主机名
      HOSTTYPE=x86_64                     <== 主机安装的软件主要类型

      IFS=$‘ \t\n‘                    <== 默认的分隔符

      LINES=24                      <== 目前的终端机下的最大行数

      MACHTYPE=x86_64-redhat-linux-gnu             <== 安装的机器类型

      MAILCHECK=60              <== 与邮件有关。每 60 秒去检索一次信箱有无新信息

      OLDPWD=/home           <== 上个工作目录。我们可以用 cd - 来取用这个变量

      OSTYPE=linux-gnu        <== 操作系统的类型

      PPID=1981                     <== 父程序的 PID

      PS1=‘[\u@\h \W]\$ ‘     <== 命令提示字符,也就是我们常见的 [root@www ~]# 或 [dmtsai ~]$ 的配置值

     $                                     <== 目前这个 shell 所使用的 PID

     ?                                     <== 刚刚运行完命令的回传值

注:在 Linux 默认的情况中,使用{大写的字母}来配置的变量一般为系统内定需要的变量。

与PS1提示字符有关的符号含义:

     \d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2" ;

    \H :完整的主机名;

    \h :仅取主机名在第一个小数点之前的名字;

    \t :显示时间,为 24 小时格式的『HH:MM:SS』;

   \T :显示时间,为 12 小时格式的『HH:MM:SS』;

   \A :显示时间,为 24 小时格式的『HH:MM』;

   \@ :显示时间,为 12 小时格式的『am/pm』样式;

   \u :目前使用者的账号名称,如『root』;

   \v :BASH 的版本信息,如鸟哥的测试主板本为 3.2.25(1),仅取『3.2』显示;

   \w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;

  \W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名;

  \# :下达的第几个命令;

  \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 。

注:在 bash 里面?这个变量表示『上一个运行的命令所回传的值』,当我们运行某些命令时,这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 0 值,如果运行过程发生错误,就会回传『错误代码』。 如 echo $?

初识shell

标签:计算机硬件   windows   操作系统   linux   朋友   

原文地址:http://dyqd2011.blog.51cto.com/3201444/1736583

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!