目的
使用linux时用户可以通过一个又一个的命令来完成各种操作,除了基础的各个命令外linux还提供了各种便利的功能来协调使用这些命令。这些功能让用户在使用linux时可以更加得心应手,也为shell脚本编写提供了巨大的可能性。这篇文章将对相关的内容做个简单的记录。
通配符
通配符可以用来代替匹配某些字符内容,常用的一些通配符示例如下:
表达式 | 描述 | 表达式 | 描述 |
---|---|---|---|
* | 单个或多个任意字符 | ? | 单个任意字符 |
[145] | 匹配 1 4 5 | [abD] | 匹配 a b D |
[4-8] | 匹配 4 5 6 7 8 | [a-z] | 匹配 a~z,即所有小写字母 |
[C-F] | 匹配 C D E F | [2-7,c-e] | 匹配 2 ~ 7 和 c ~ e |
[!345] | 不匹配3 4 5 | [^345] | 同[!345] |
[[:alpha:]] | 单个任意字母 | [[:digit:]] | 单个任意数字 |
[[:upper:]] | 单个任意大写字母 | [[:lower:]] | 单个任意小写字母 |
[[:alnum:]] | 单个任意字母或数字 | [[:punct:]] | 单个标点符号 |
转义符
转义符在各种编程语言中都很常见,一般是将有特殊功能的符号变成普通字符或是反一反。在linux命令操作中主要可以使用下面几个转义符:
符号 | 说明 |
---|---|
反斜杠 \ | 将其后面的符号变为普通字符,比如变量符号、通配符等 |
单引号 ’ ’ | 其内部所有内容都变为单纯的字符串 |
双引号 " " | 将其内部所有内容变为单纯的字符串,$和``不进行转义 |
反引号 ` ` | 命令替换,替换为其中命令的结果,也可用 $( ) 代替 |
pi@raspberrypi:~ $ echo $HOME
/home/pi
pi@raspberrypi:~ $ echo \$HOME
$HOME
pi@raspberrypi:~ $ echo '$HOME'
$HOME
pi@raspberrypi:~ $ echo date
date
pi@raspberrypi:~ $ echo `date`
Fri 03 Sep 2021 10:30:29 AM CST
流程控制
shell中通常一行只能使用一条命令,我们可以使用一些符号让多条命令一起执行,下面是一些基础的符号:
符号 | 示例 | 说明 |
---|---|---|
; | 命令1 ; 命令2 | 命令1和命令2按顺序执行 |
&& | 命令1 && 命令2 | 当命令1执行正确,命令2才会执行 |
|| | 命令1 || 命令2 | 当命令1执行不正确,命令2才会执行 |
() | (命令1 ; 命令2) | 括号内的内容会作为一整块执行,注意其中使用cd命令的话只会对这一块有效 |
pi@raspberrypi:~ $ (cd Desktop/; ls)
2.txt 3.txt 4.txt 5.txt
pi@raspberrypi:~ $ cd Desktop/; ls
2.txt 3.txt 4.txt 5.txt
pi@raspberrypi:~/Desktop $ cd Desktop/ || cd ~
bash: cd: Desktop/: No such file or directory
pi@raspberrypi:~ $ cd Desktop/ && pwd
/home/pi/Desktop
pi@raspberrypi:~/Desktop $ cd ~ || pwd ; ls
Bookshelf Desktop Documents Downloads Music Pictures Public Share Templates Videos
pi@raspberrypi:~ $ cd ~ || (pwd ; ls)
pi@raspberrypi:~ $ cd ~ || pwd ; ls
Bookshelf Desktop Documents Downloads Music Pictures Public Share Templates Videos
pi@raspberrypi:~ $
管道符
linux中管道符 |
是非常好用的一个功能,它的功能很简单 —— 把前一个命令要输出的信息当作后一个命令的标准输入 。
管道符最常用的场景就是结合 grep 命令使用:
重定向
通常操作命令时输出的内容会直接显示在shell中,我们可以使用重定向的方式将其输出到其它地方。重定向不光有输出的重定向,也有输入的重定向。这里涉及到一个文件描述符(File Descriptor)的概念。
文件描述符以数字形式表示(0、1、2、……),简单的来说可以理解成为文件或设备(Linux中一切皆文件,设备在系统中也表现为文件)的指针。默认情况下文件描述符 0、1、2 是有特定功能和默认指向的文件的:
文件描述符 | 名称 | 功能 | 默认操作 |
---|---|---|---|
0 | stdin | 标准输入 | 从键盘输入 |
1 | stdout | 标准输出 | 输出到屏幕(终端) |
2 | stderr | 标准错误 | 输出到屏幕(终端) |
我们常用的命令执行时如果有信息输出,这些信息都会输出到文件描述符1的文件中。默认情况下文件描述符1是指向屏幕(终端)的,所以我们可以在屏幕(终端)中看到命令输出的内容。
对于指针而言我们可以改变其指向的对象,文件描述符也差不多,我们可以改变其指向的文件。如果我们将文件描述符1指向的文件改成某个其它的文件,比如log.txt,那么命令执行时原本应该输出到屏幕(终端)的信息就会被输出到log.txt中,这就是重定向了。
基础的重定向方式如下:
表达式 | 描述 |
---|---|
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止,分界符是自己定义的字符串 |
命令 > 文件 | 将标准输出覆盖到文件中,等价于 命令 1> 文件 |
命令 >> 文件 | 将标准输出追加到文件中,等价于 命令 1>> 文件 |
命令 2> 文件 | 将错误信息覆盖到文件中 |
命令 2>> 文件 | 将错误信息追加到文件中 |
命令 &> 文件 | 将标准输出和错误信息覆盖到文件中 |
命令 &>> 文件 | 将标准输出和错误信息追加到文件中 |
上面只是些最基本的重定向,事实上重定向经常组合使用,组合使用时从左到右进行,比如下面的例子:
表达式 | 描述 |
---|---|
命令 < 文件A > 文件B | 将文件A作为命令的标准输入并将标准输出到文件B |
命令 > 文件A 2>> 文件B | 将标准输出覆盖到文件A中,将错误信息追加到文件B中 |
命令 > 文件 2>&1 | 这个表达式相当于 命令 1> 文件 2>&1 先将标准输出覆盖到文件中,再将错误信息也修改为标准输出,这样它也会写入到文件中 最终的结果就是标准输出和错误信息一起覆盖到文件中 |
命令 >> 文件 2>&1 | 将标准输出和错误信息一起覆盖到文件中 |
上面出现的各种重定向方式都只在当前进程的当前语句有效,如果想要在当前进程一直生效的化可以使用 exec
命令,可以使用 man exec
或 exec --help
等方式查看具体使用方式。
环境变量
在shell中可以像各种编程语言一样定义变量,然后在一般操作中使用这些变量:
pi@raspberrypi:~ $ NAISU=/home/pi/Desktop
pi@raspberrypi:~ $ cd $NAISU
pi@raspberrypi:~/Desktop $ pwd
/home/pi/Desktop
一个变量可以有多个值,各个值之间使用:(冒号)分隔:
pi@raspberrypi:~/Desktop $ NAISU=aaa
pi@raspberrypi:~/Desktop $ echo $NAISU
aaa
pi@raspberrypi:~/Desktop $ NAISU=$NAISU:bb
pi@raspberrypi:~/Desktop $ echo $NAISU
aaa:bb
上面的定义的这些变量只有当前用户可以用,需要输出到全局才可以给其他用户用:
pi@raspberrypi:~/Desktop $ export NAISU
如果不需要这个变量了可以把它取消掉:
pi@raspberrypi:~/Desktop $ unset NAISU
前面定义的变量在系统重启后就消失了,想要重启后还能继续用的话只要在系统启动或是用户登陆时会执行的脚本中添加相关的命令即可。通常可用的脚本文件有一下一些(可能有也可能没有,依顺序执行,对于同一个变量后面的会覆盖前面的):
/etc/profile
/etc/bashrc
~/.bash_profile
~/.profile
~/.bashrc
上面这些文件中通常默认已经有一些命令脚本了,其中就包含系统默认的环境变量设置。(通常来说bashrc是系统启动后就会执行的,而profile是用户登陆后才会执行的。)
可以使用 env
命令查看当前用户可用的环境变量。常用的一些环境变量如下:
变量名 | 描述 | 变量名 | 描述 |
---|---|---|---|
HOME | 用户的主目录 | SHELL | 用户在使用的Shell解释器名称 |
PATH | 解释器搜索用户执行命令的路径 | EDITOR | 用户默认的文本解释器 |
RANDOM | 生成一个随机数字 | LANG | 系统语言、语系名称 |
总结
这篇文章中介绍的各个命令使用相关的功能单个来看都非常简单,但是组合起来使用就拥有了丰富的可能性。很多时候仅仅使用命令与上面各个功能组合就可以实现大部分需求了。