天天看点

Linux-Bash Shell

重要基本概念:

  1. 管理整个硬件是核心(kernel),一般使用者(user)则是以shell来跟核心沟通。
  2. 替我们工作的是『硬件』,而控制硬件的是『核心』,我们使用者乃是利用『Shell』控制一些kernel提供的『工具 (Utility)』来操控硬件替我们正确的工作。
  3. kernel是『核心』的意思,而 Shell 是『壳』的意思。
  4. shell 有很多版本,例如:常听到的 Bourne SHell (sh) 、在 Sun 里头预设的 C SHell、 商业上常用的 K SHell、, 还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本就称为『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本,也是基准于GNU 的架构下发展出来。
  5. BASH shell是GNU计划中重要的工具软件,目前也是GUN操作系统中标准的shell,它主要兼容于sh,并且依据一些使用者需求,而加强的shell版本,可以说目前几乎所有的Linux distribution 都使用bash作为管理核心的主要shell。
  6. BASH优点:

    ① 命令编修能力(类似DOS的doskey功能):『他能记忆使用过的指令』 曾经下达过的指令都被记录下来了,记录的档案在你的家目录内的 .bash_history 。~/.bash_history 记录的是前一次登入以前所执行过的指令, 而至于这一次登入所执行的指令都被暂存在暂内存中,当你成功的注销系统后,该指令记忆才会记录到 .bash_history 当中。『查询曾经做过的举动』如此可以知道你的执行步骤,那么就可以追踪您曾下达的指令,以作为除错的工具。

    ② 命令与档案补全功能: [tab] 如果想要知道系统当中所有以 c 为开头的指令呢?就按下 c[tab] [tab] 。

    ③ 命令别名(alias)设定功能:alias 就可以知道目前的命令别名有哪些了。也可以直接下达命令来设定别名:alias lm=’ls -al’。

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

    ⑤ Shell scripts 的强大功能:将日常生活当中常需要下达的连续指令写成一个档案, 该档案并且可以透过对谈交互式的方式来进行主机的侦测工作。也可以藉由 shell 提供的环境变量及相关指令来进行设计,整个设计下来几乎就是一个小型的程序语言。

    ⑥ 万用字符:除了完整的字符串之外, bash 还支持许多的万用字符来帮助使用者查询与指令下达。例如想要知道 /usr/X11R6/bin 底下有多少以 xt 为开头的档案,使用: ls -l /usr/X11R6/bin/xt*

  7. type : ① 查看指令是否为bash的内建指令;② 找指令。

    bash 的说明文档:man bash

    查看指令是否为『内建』指令:type [-tpa] name 例如:type cd

    参数:

    :不加任何参数时,则 type 会显示出那个 name 是外部指令还是 bash 内建的指令!

    -t:当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义。

    file:表示为外部指令;

    alias:表示该指令为命令别名所设定的名称;

    builtin:表示该指令为 bash 内建的指令功能;

    -p:如果后面接的 name 为指令时,会显示完整文件名(外部指令)或显示为内建指令;

    -a:会将由 PATH 变量定义的路径中,将所有含有 name 的指令都列出来,包含 alias

  8. 指令下达方法:
    [root@linux ~]# command [-options] parameter1 parameter2 ...
                      指令       选项      参数()     参数()
               
    说明:
    1. 一行指令中第一个输入的绝对是『指令(command)』或『可执行档案』
    2. command 为指令的名称,例如变换路径的指令为 cd 等等;
    3. 中刮号[]并不存在于实际的指令中,而加入参数设定时,通常为 - 号,例如 -h;有时候完整参数名称会输入 – 符号,例如 –help;
    4. parameter1 parameter2.. 为依附在 option 后面的参数,

      或者是 command 的参数;

    5. command, -options, parameter1.. 中间以空格来区分,不论空几格 shell 都视为一格;
    6. 按下 [Enter] 按键后,该指令就立即执行。[Enter] 按键为 字符,他代表着一行指令的开始启动。
    7. 指令太长的时候,可以使用 \ 符号来跳脱 [Enter] 符号,使指令连续到下一行。*注意! \ 后就立刻接特殊字符。
    8. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。
  9. 变量:是以一组文字或符号等,来取代一些设定或者是一串保留的数据。

    在下达正确的指令,应该需要指定路径与文件名。但是为何我们在任意路径下都可以执行ls呢?而不需要指定路径呢?这是因为系统已经预设了一些『搜寻路径(PATH)』了,所以当我们执行一些指令时,系统就会按照该PATH的设定来进行指令的搜索。而这个PATH就是所谓的变量。

    如何『显示变量』呢?使用echo这个指令。

    变量的取用与设定:echo;变量设定规则:unset;

    [root@linux ~]# echo $variable
    [root@linux ~]# echo $PATH
    /bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
    [root@linux ~]# echo ${PATH}
               
  10. 如何『设定』或者是『修改』 某个变量的内容?

    用『等号(=)』连接变量与他的内容。

    例如:

    [root@localhost Jianan]# echo $myname
    
    [root@localhost Jianan]# myname=VBird
    [root@localhost Jianan]# echo $myname
    VBird
               

    这样变量名称myname的内容就带有VBird这个数据了。当一个变量名称尚未被设定时,预设的内容是『空』的。并且,变量在设定时,还是需要符合某些规定的,否则会设定失败。

    规则如下:

    1. 变量与变量内容用等号连接;
    2. 等号两边不能直接接空格符;
    3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;
    4. 若有空格符可以使用双引号『 ” 』或单引号『 ’ 』来将变量内容结合起来,但须要特别留意, 双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;
    5. 必要时需要以跳脱字符『 \ 』来将特殊符号 ( 如 Enter, $, , 空格符, ’ 等 ) 变成一般符号
    6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote 『` command 』;(特别特别注意,那个`是键盘上方的数字键 1 左边那个按键,而不是单引号!)
    7. 若该变量为扩增变量内容时,则需以双引号及$量名称 如:『”$PATH”:/home』继续累加内容;
    8. 若该变量需要在其它子程序执行,则需要以 export 来使变量变成环境变量, 如『 export PATH』;
    9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断 ( 纯粹依照使用者兴趣与嗜好 ) ;
    10. 取消变量的方法为:『 unset 变量名称』。

    规则比较复杂,可以直接看例子:

    例一:设定一变量 name ,且内容为 VBird 。

    [[email protected] Jianan]# 12name=VBird
    bash: 12name=VBird: 未找到命令...
    [[email protected] Jianan]# name = VBird
    bash: name: 未找到命令...
    [[email protected] Jianan]# name=VBird
    [[email protected] Jianan]# echo $name
    VBird
               
    例二:范例二:承上题,若变量内容为 VBird’s name 呢?
    [[email protected] Jianan]# name=VBird's name
    > 
    > \
    > /
    > ;
    > '
    [[email protected] Jianan]# echo $name
    VBirds name \ / ;
    [[email protected] Jianan]# name="VBird's name"
    [[email protected]ost Jianan]# echo $name
    VBird's name
    [[email protected] Jianan]# name=VBird\'s\ name
    [[email protected] Jianan]# echo $name
    VBird's name
               
    例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录
    [root@localhost Jianan]# PATH=$PATH:/home/dmtsai/bin
    [root@localhost Jianan]# PATH="$PATH":/home/dmtsai/bin
               
    例四:呈范例三,我要将 name 的内容多出 “yes” 呢?
    [root@localhost Jianan]# name=VBird
    [root@localhost Jianan]# echo $name
    VBird
    [root@localhost Jianan]# name="$name"yes
    [root@localhost Jianan]# echo $name
    VBirdyes
    [root@localhost Jianan]# name=${name}acb
    [root@localhost Jianan]# echo $name
    VBirdyesacb
               
    例五:如何让我刚刚设定的 name=VBird 可以用在下个 shell 的程序?
    [root@localhost Jianan]# name=VBird
    [root@localhost Jianan]# bash
    [root@localhost Jianan]# echo $name
    
    [root@localhost Jianan]# exit
    exit
    [root@localhost Jianan]# export name
    [root@localhost Jianan]# bash
    [root@localhost Jianan]# echo $name
    VBird
    [root@localhost Jianan]# exit
    exit
               

    说明:什么是子程序?就是在我目前这个shell的情况下,去启动一个新的shell,新的那个shell就是子程序了。在一般的状态下,父程序的自定变量是无法在子程序内使用的。但是透过export将变量变成环境变量后,就能够在子程序下应用了。

    例六:如何进入到您目前核心的模块目录?

    [[email protected] Jianan]# cd /lib/modules
    [[email protected] modules]# ls
    -fc22.x86_64
    [[email protected] modules]# cd 4.0.4-301.fc22.x86_64/
    [[email protected] -fc22.x86_64]# ls
    build                modules.dep          modules.softdep
    kernel               modules.dep.bin      modules.symbols
    modules.alias        modules.devname      modules.symbols.bin
    modules.alias.bin    modules.drm          source
    modules.block        modules.modesetting  updates
    modules.builtin      modules.networking   vdso
    modules.builtin.bin  modules.order
    [[email protected] -fc22.x86_64]# cd kernel/
    [[email protected] kernel]# ls
    arch  crypto  drivers  fs  kernel  lib  mm  net  security  sound
               

    例七:取消刚刚设定的 name 这个变量内容

    例八:在变量的设定中,单引号与双引号的用途有何不同?

    单引号与双引号的最大不同在于上引号仍然可以保有变量的内容,但

    这里写代码片
               
  11. 变量的用途

    ① 简化路径名;

    ② 常常需要定义变量在script里面。

如果能够借由shell提供的命令重导向(或称数据流重导向),以及管线命令。

命令总结:

1. cat etc/shells

2. ls -al —查看目录底下的所有档案(包含隐藏档)及所有的档案属性

3. alias –查看目前的命令有哪些别名

4. alias lm = ‘ls -al’ –设定别名

5. ls -l /usr/X11R6/bin/xt* –使用万用字符查看/usr/X11R6/bin 底下有多少以 xt 为开头的档案

6. su root –获取管理员身份

Linux 各个盘分别是什么?

继续阅读