\a
:响铃\b
:退格\n
:换行\r
:回车\t
:制表符如果想要在命令行使用这些不可打印的字符,可以把它们放在引号里面,然后使用
echo
命令的-e
参数。$ echo a\tb atb $ echo -e "a\tb" a b
$ mv \ /path/to/foo \ /path/to/bar # 等同于 $ mv /path/to/foo /path/to/bar
- 如果一条命令过长,就可以在行尾使用反斜杠,将其改写成多行。
Here 文档
Here 文档(here document)是一种输入多行字符串的方法,格式如下。
<< token text token
它的格式分成开始标记(
<< token
)和结束标记(token
)。开始标记是两个小于号 + Here 文档的名称,名称可以随意取,后面必须是一个换行符;结束标记是单独一行顶格写的 Here 文档名称,如果不是顶格,结束标记不起作用。两者之间就是多行字符串的内容。Here 文档内部会发生变量替换,同时支持反斜杠转义,但是不支持通配符扩展,双引号和单引号也失去语法作用,变成了普通字符。
$ foo='hello world' $ cat << _example_ $foo "$foo" '$foo' _example_ hello world "hello world" 'hello world'
变量
$foo
发生了替换,但是双引号和单引号都原样输出了,表明它们已经失去了引用的功能。如果不希望发生变量替换,可以把 Here 文档的开始标记放在单引号之中。
$ foo='hello world' $ cat << '_example_' $foo "$foo" '$foo' _example_ $foo "$foo" '$foo'
Here 文档的开始标记(
_example_
)放在单引号之中,导致变量替换失效了。Here 文档的本质是重定向,它将字符串重定向输出给某个命令,相当于包含了
echo
命令。$ command << token string token # 等同于 $ echo string | command
上面代码中,Here 文档相当于
echo
命令的重定向。所以,Here 字符串只适合那些可以接受标准输入作为参数的命令,对于其他命令无效,比如
echo
命令就不能用 Here 文档作为参数。$ echo << _example_ hello _example_
上面例子不会有任何输出,因为 Here 文档对于
echo
命令无效。此外,Here 文档也不能作为变量的值,只能用于命令的参数。
Here 字符串
Here 文档还有一个变体,叫做 Here 字符串(Here string),使用三个小于号(
<<<
)表示。<<< string
它的作用是将字符串通过标准输入,传递给命令。
有些命令直接接受给定的参数,与通过标准输入接受参数,结果是不一样的。所以才有了这个语法,使得将字符串通过标准输入传递给命令更方便,比如
cat
命令只接受标准输入传入的字符串。$ md5sum <<< 'ddd' # 等同于 $ echo 'ddd' | md5sum
上面例子中,
md5sum
命令只能接受标准输入作为参数,不能直接将字符串放在命令后面,会被当作文件名,即md5sum ddd
里面的ddd
会被解释成文件名。这时就可以用 Here 字符串,将字符串传给md5sum
命令。
创建变量
用户创建变量的时候,变量名必须遵守下面的规则。
- 字母、数字和下划线字符组成。
- 第一个字符必须是一个字母或一个下划线,不能是数字。
- 不允许出现空格和标点符号。
- 如果同一行定义多个变量,必须使用分号(
;
)分隔。
读取变量
$ myvar=USER $ echo ${!myvar} ruanyf
- 如果变量的值本身也是变量,可以使用
${!varname}
的语法,读取最终的值。$ a="1 2 3" $ echo $a 1 2 3 $ echo "$a" 1 2 3
- 上面示例中,变量
a
的值包含两个连续空格。如果直接读取,Shell 会将连续空格合并成一个。只有放在双引号里面读取,才能保持原来的格式。
特殊变量
Bash 提供一些特殊变量。这些变量的值由 Shell 提供,用户不能进行赋值。
(1)
$?
$?
为上一个命令的退出码,用来判断上一个命令是否执行成功。返回值是0
,表示上一个命令执行成功;如果不是零,表示上一个命令执行失败。$ ls doesnotexist ls: doesnotexist: No such file or directory $ echo $? 1
上面例子中,
ls
命令查看一个不存在的文件,导致报错。$?
为1,表示上一个命令执行失败。(2)
$$
$$
为当前 Shell 的进程 ID。$ echo $$ 10662
这个特殊变量可以用来命名临时文件。
LOGFILE=/tmp/output_log.$$
(3)
$_
$_
为上一个命令的最后一个参数。$ grep dictionary /usr/share/dict/words dictionary $ echo $_ /usr/share/dict/words
(4)
$!
$!
为最近一个后台执行的异步命令的进程 ID。$ firefox & [1] 11064 $ echo $! 11064
上面例子中,
firefox
是后台运行的命令,$!
返回该命令的进程 ID。(5)
$0
$0
为当前 Shell 的名称(在命令行直接执行时)或者脚本名(在脚本中执行时)。$ echo $0 bash
上面例子中,
$0
返回当前运行的是 Bash。(6)
$-
$-
为当前 Shell 的启动参数。$ echo $- himBHs
(7)$@
和$#
$#
表示脚本的参数数量,$@
表示脚本的参数值。
快捷键
下面是其他一些与操作历史相关的快捷键。
Ctrl + p
:显示上一个命令,与向上箭头效果相同(previous)。Ctrl + n
:显示下一个命令,与向下箭头效果相同(next)。Alt + <
:显示第一个命令。Alt + >
:显示最后一个命令,即当前的命令。Ctrl + o
:执行历史文件里面的当前条目,并自动显示下一条命令。这对重复执行某个序列的命令很有帮助。光标移动
Readline 提供快速移动光标的快捷键。
Ctrl + a
:移到行首。Ctrl + b
:向行首移动一个字符,与左箭头作用相同。Ctrl + e
:移到行尾。Ctrl + f
:向行尾移动一个字符,与右箭头作用相同。Alt + f
:移动到当前单词的词尾。Alt + b
:移动到当前单词的词首。上面快捷键的 Alt 键,也可以用 ESC 键代替。
清除屏幕
Ctrl + l
快捷键可以清除屏幕,即将当前行移到屏幕的第一行,与clear
命令作用相同。编辑操作
下面的快捷键可以编辑命令行内容。
Ctrl + d
:删除光标位置的字符(delete)。Ctrl + w
:删除光标前面的单词。Ctrl + t
:光标位置的字符与它前面一位的字符交换位置(transpose)。Alt + t
:光标位置的词与它前面一位的词交换位置(transpose)。Alt + l
:将光标位置至词尾转为小写(lowercase)。Alt + u
:将光标位置至词尾转为大写(uppercase)。使用
Ctrl + d
的时候,如果当前行没有任何字符,会导致退出当前 Shell,所以要小心。剪切和粘贴快捷键如下。
Ctrl + k
:剪切光标位置到行尾的文本。Ctrl + u
:剪切光标位置到行首的文本。Alt + d
:剪切光标位置到词尾的文本。Alt + Backspace
:剪切光标位置到词首的文本。Ctrl + y
:在光标位置粘贴文本。同样地,Alt 键可以用 Esc 键代替。
自动补全
命令输入到一半的时候,可以按一下 Tab 键,Readline 会自动补全命令或路径。比如,输入
cle
,再按下 Tab 键,Bash 会自动将这个命令补全为clear
。如果符合条件的命令或路径有多个,就需要连续按两次 Tab 键,Bash 会提示所有符合条件的命令或路径。
除了命令或路径,Tab 还可以补全其他值。如果一个值以
$
开头,则按下 Tab 键会补全变量;如果以~
开头,则补全用户名;如果以@
开头,则补全主机名(hostname),主机名以列在/etc/hosts
文件里面的主机为准。自动补全相关的快捷键如下。
- Tab:完成自动补全。
Alt + ?
:列出可能的补全,与连按两次 Tab 键作用相同。Alt + /
:尝试文件路径补全。Ctrl + x /
:先按Ctrl + x
,再按/
,等同于Alt + ?
,列出可能的文件路径补全。Alt + !
:命令补全。Ctrl + x !
:先按Ctrl + x
,再按!
,等同于Alt + !
,命令补全。Alt + ~
:用户名补全。Ctrl + x ~
:先按Ctrl + x
,再按~
,等同于Alt + ~
,用户名补全。Alt + $
:变量名补全。Ctrl + x $
:先按Ctrl + x
,再按$
,等同于Alt + $
,变量名补全。Alt + @
:主机名补全。Ctrl + x @
:先按Ctrl + x
,再按@
,等同于Alt + @
,主机名补全。Alt + *
:在命令行一次性插入所有可能的补全。Alt + Tab
:尝试用.bash_history
里面以前执行命令,进行补全。上面的
Alt
键也可以用 ESC 键代替。其他快捷键
Ctrl + j
:等同于回车键(LINEFEED)。Ctrl + m
:等同于回车键(CARRIAGE RETURN)。Ctrl + o
:等同于回车键,并展示操作历史的下一个命令。Ctrl + v
:将下一个输入的特殊字符变成字面量,比如回车变成^M
。Ctrl + [
:等同于 ESC。Alt + .
:插入上一个命令的最后一个词。Alt + _
:等同于Alt + .
。上面的
Alt + .
快捷键,对于很长的文件路径,有时会非常方便。因为 Unix 命令的最后一个参数通常是文件路径。$ mkdir foo_bar $ cd #按下 Alt + .
上面例子中,在
cd
命令后按下Alt + .
,就会自动插入foo_bar
。