Bash 的基本语法

    由于后面的例子会大量用到echo命令,这里先介绍这个命令。

    echo命令的作用是在屏幕输出一行文本,可以将该命令的参数原样输出。

    上面例子中,echo的参数是hello world,可以原样输出。

    如果想要输出的是多行文本,即包括换行符。这时需要把多行文本放在引号里面。

    1. $ echo "<HTML>
    2. <HEAD>
    3. <TITLE>Page Title</TITLE>
    4. </HEAD>
    5. <BODY>
    6. Page body.
    7. </BODY>
    8. </HTML>"

    上面例子中,echo可以原样输出多行文本。

    默认情况下,echo输出的文本末尾会有一个回车符。-n参数可以取消末尾的回车符,使得下一个提示符紧跟在输出内容的后面。

    1. $ echo -n hello world
    2. hello world$

    上面例子中,world后面直接就是下一行的提示符$

    1. $ echo a;echo b
    2. a
    3. b
    4. $ echo -n a;echo b

    上面例子中,-n参数可以让两个echo命令的输出连在一起,出现在同一行。

    -e参数

    -e参数会解释引号(双引号和单引号)里面的特殊字符(比如换行符\n)。如果不使用-e参数,即默认情况下,引号会让特殊字符变成普通字符,echo不解释它们,原样输出。

    1. $ echo "Hello\nWorld"
    2. Hello\nWorld
    3. # 双引号的情况
    4. $ echo -e "Hello\nWorld"
    5. Hello
    6. World
    7. # 单引号的情况
    8. Hello
    9. World

    上面代码中,-e参数使得\n解释为换行符,导致输出内容里面出现换行。

    命令格式

    命令行环境中,主要通过使用 Shell 命令,进行各种操作。Shell 命令基本都是下面的格式。

    1. $ command [ arg1 ... [ argN ]]

    上面代码中,command是具体的命令或者一个可执行文件,arg1 ... argN是传递给命令的参数,它们是可选的。

    1. $ ls -l

    上面这个命令中,ls是命令,-l是参数。

    上面命令中,-r是短形式,--reverse是长形式,作用完全一样。前者便于输入,后者便于理解。

    Bash 单个命令一般都是一行,用户按下回车键,就开始执行。有些命令比较长,写成多行会有利于阅读和编辑,这时可以在每一行的结尾加上反斜杠,Bash 就会将下一行跟当前行放在一起解释。

    1. $ echo foo bar
    2. # 等同于
    3. $ echo foo \
    4. bar

    Bash 使用空格(或 Tab 键)区分不同的参数。

    1. $ command foo bar

    上面命令中,foobar之间有一个空格,所以 Bash 认为它们是两个参数。

    如果参数之间有多个空格,Bash 会自动忽略多余的空格。

    1. $ echo this is a test
    2. this is a test

    上面命令中,atest之间有多个空格,Bash 会忽略多余的空格。

    分号

    分号(;)是命令的结束符,使得一行可以放置多个命令,上一个命令执行结束后,再执行第二个命令。

    1. $ clear; ls

    上面例子中,Bash 先执行clear命令,执行完成后,再执行ls命令。

    注意,使用分号时,第二个命令总是接着第一个命令执行,不管第一个命令执行成功或失败。

    除了分号,Bash 还提供两个命令组合符&&||,允许更好地控制多个命令之间的继发关系。

    1. Command1 && Command2

    上面命令的意思是,如果Command1命令运行成功,则继续运行Command2命令。

      上面命令的意思是,如果Command1命令运行失败,则继续运行Command2命令。

      下面是一些例子。

      1. $ cat filelist.txt && ls -l filelist.txt

      上面例子中,只有cat命令执行成功,才会继续执行命令。如果cat执行失败(比如不存在文件flielist.txt),那么ls命令就不会执行。

      1. $ mkdir foo || mkdir bar

      上面例子中,只有mkdir foo命令执行失败(比如foo目录已经存在),才会继续执行mkdir bar命令。如果mkdir foo命令执行成功,就不会创建bar目录了。

      type 命令

      Bash 本身内置了很多命令,同时也可以执行外部程序。怎么知道一个命令是内置命令,还是外部程序呢?

      type命令用来判断命令的来源。

      1. $ type echo
      2. echo is a shell builtin
      3. $ type ls
      4. ls is hashed (/bin/ls)

      上面代码中,type命令告诉我们,echo是内部命令,ls是外部程序(/bin/ls)。

      type命令本身也是内置命令。

      1. $ type type
      2. type is a shell builtin

      如果要查看一个命令的所有定义,可以使用type命令的-a参数。

      1. $ type -a echo
      2. echo is shell builtin
      3. echo is /usr/bin/echo
      4. echo is /bin/echo

      上面代码表示,echo命令即是内置命令,也有对应的外部程序。

      type命令的-t参数,可以返回一个命令的类型:别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)。

      1. $ type -t bash
      2. file
      3. $ type -t if
      4. keyword

      上面例子中,bash是文件,if是关键词。

      Bash 提供很多快捷键,可以大大方便操作。下面是一些最常用的快捷键,完整的介绍参见《行操作》一章。

      • Ctrl + L:清除屏幕并将当前行移到页面顶部。
      • Ctrl + C:中止当前正在执行的命令。
      • Shift + PageUp:向上滚动。
      • Shift + PageDown:向下滚动。
      • Ctrl + U:从光标位置删除到行首。
      • Ctrl + K:从光标位置删除到行尾。
      • Ctrl + D:关闭 Shell 会话。
      • :浏览已执行命令的历史记录。

      除了上面的快捷键,Bash 还具有自动补全功能。命令输入到一半的时候,可以按下 Tab 键,Bash 会自动完成剩下的部分。比如,输入,然后按一下 Tab 键,Bash 会自动补上d

      除了命令的自动补全,Bash 还支持路径的自动补全。有时,需要输入很长的路径,这时只需要输入前面的部分,然后按下 Tab 键,就会自动补全后面的部分。如果有多个可能的选择,按两次 Tab 键,Bash 会显示所有选项,让你选择。