Linuxshell学习笔记(9)

  • \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

 

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值