前言

Linux的符号有很多,而且也有很多在不同情况下的用法不同。

而且还有很多符号应用在shell脚本啊,各种判断循环啊之类的,正则表达式啊。

我们这里既然叫初识Linux,只谈命令行中符号最简单的用法,不包括shell及正则表达式。

正文

通配符

通配符的符号和正则表达式所用符号有很多重叠,但是意思有可能完全不一样,所以一定要注意区分通配符和正则表达式符号。

  • * 匹配0个或多个字符,通配符表示这些字符的内容(正则表示字符个数)

一般用来匹配文件名,或者文本编辑时的搜索。

[root@master ~]# ls /etc/yum.repos.d/*.repo
/etc/yum.repos.d/CentOS-Base.repo       /etc/yum.repos.d/CentOS-Media.repo
/etc/yum.repos.d/CentOS-CR.repo         /etc/yum.repos.d/CentOS-Sources.repo
/etc/yum.repos.d/CentOS-Debuginfo.repo  /etc/yum.repos.d/CentOS-Vault.repo
/etc/yum.repos.d/CentOS-fasttrack.repo  /etc/yum.repos.d/epel.repo
# 显示所有以.repo结尾的文件

[root@master ~]# ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3
# 显示sda开头任意结尾的文件
  • ? 匹配任意单个字符
[root@master ~]# ls /dev/sda?
/dev/sda1  /dev/sda2  /dev/sda3

[root@master ~]# ls /dev/sd?
/dev/sda
# 区别于sda*

[root@master ~]# ls /etc/h*.????
/etc/host.conf  /etc/hosts.deny
# 可以连续使用多个
  • [ ] 匹配方括号范围内的任意单个字符

其中方括号内可以使用列表(如[abc]),范围(如[1-3]),排除(如[!abc][^abc])。

[root@master ~]# mkdir wildcards
[root@master ~]# cd wildcards
[root@master wildcards]# touch ksa ksb ksc ksd kse ksf ks1 ks2 ks3
# 创建测试文件

[root@master wildcards]# ls ks[abc]
ksa  ksb  ksc
[root@master wildcards]# ls ks[abc123]
ks1  ks2  ks3  ksa  ksb  ksc
# 方括号内容表示列表

[root@master wildcards]# ls ks[1-3]
ks1  ks2  ks3
[root@master wildcards]# ls ks[b-e]
ksb  ksc  ksd  kse
# 方括号内容表示范围

[root@master wildcards]# ls ks[!abc123]
ksd  kse  ksf
[root@master wildcards]# ls ks[^abc]
ks1  ks2  ks3  ksd  kse  ksf
[root@master wildcards]# ls ks[!a-e]
ks1  ks2  ks3  ksf
# 方括号内容表示排除
  • { } 逐一匹配大括号内全部内容

其中大括号内可以使用列表(如{1,2,3})、范围(如{1..3})。

[root@master wildcards]# ls
ks1  ks2  ks3  ksa  ksb  ksc  ksd  kse  ksf
[root@master wildcards]# rm -f ks*
[root@master wildcards]# ll
total 0
# 创建测试环境

[root@master wildcards]# touch {1,2,3}
[root@master wildcards]# ls
1  2  3
[root@master wildcards]# touch {My,name,is,gaoqichen}
[root@master wildcards]# ls
1  2  3  gaoqichen  is  My  name
# 表示全部匹配列表中内容

[root@master wildcards]# rm -f *
[root@master wildcards]# touch {01..10}
[root@master wildcards]# ls
01  02  03  04  05  06  07  08  09  10
# 表示全部匹配范围中内容

[root@master wildcards]# rm -f *
[root@master wildcards]# touch {1..3}{a..c}
[root@master wildcards]# ls
1a  1b  1c  2a  2b  2c  3a  3b  3c
[root@master wildcards]# rm -f *
[root@master wildcards]# touch {ksa,ksb,ksc}{1..2}
[root@master wildcards]# ls
ksa1  ksa2  ksb1  ksb2  ksc1  ksc2
# 多个大括号结合使用

[root@master wildcards]# rm -f *
[root@master wildcards]# touch ks
[root@master wildcards]# cp {ks,ks.bak}
[root@master wildcards]# ls
ks  ks.bak
[root@master wildcards]# cp ks{,.bak1}
[root@master wildcards]# ls
ks  ks.bak  ks.bak1
# 实际中的应用,最常用于备份文件

重定向

Linux启动后,会默认打开3个文件描述符,分别是:标准输入(standard input 0),正确输出(standard output 1),错误输出(error output 2)。

Linux文件描述符:可以理解为Linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。

对于Linux命令的执行,基本上是这样一个流程:(如图)

先有一个输入:输入可以是键盘输入,也可以是文件输入;

命令执行成功,会把成功结果输出到屏幕中,Standard output默认是屏幕;

命令执行失败,也会把错误输出到屏幕中,Standard error默认也是屏幕。

命令执行时,文件描述符stdin(标准输入), stdout(标准输出)和stderr(错误输出),分别绑定0, 1和2。

  • 标准输入(stdin) :绑定代码为 0 ,使用 0< 或 0<< 重定向标准输入文件;
  • 标准输出(stdout):绑定代码为 1 ,使用 1> 或 1>> 重定向标准输出文件;
  • 错误输出(stderr):绑定代码为 2 ,使用 2> 或 2>> 重定向错误输出文件。

当命令执行结束,输出完成,绑定的文件描述符自动失效,0, 1, 2又会空闲,等待下一条命令。

概念是不是有些复杂啊?新手对这个肯定是不好理解的,那我就用新手的方式介绍下:重定向用尖括号表示(标准输入输出中的代码0和1都可以省略,错误输出代码2不可以省略),尖括号可以理解为尖头,指向是从开口方向指向尖头方向,内容从开口方向传给尖头方向。单个尖括号为源内容替换目标内容,两个尖括号为源内容追加到目标内容最后。输入表示将内容输入到命令中进行执行,输出表示命令的结果输出到

要明确的是,输入输出是针对要执行的命令来说的,不是针对文件来说的。(如图1)

这么说可能不是很形象,下面还是使用例子来说明一下吧。其中使用的命令可能没有介绍,我尽量注释说明,大家尽量理解。

标准输入重定向

0< 输入重定向,可简写为<

用法:cmd < file cmd 命令以 file 文件作为 stdin

echo命令为将键盘输入内容打印到屏幕中,这个命令可以理解为键盘将内容输入给echo命令,使其在屏幕中输出。

而输入重定向用于将文件的内容输入给命令,使其结果在屏幕中输出。

[root@master ~]# mkdir redirect
[root@master ~]# cd redirect/
[root@master redirect]# touch test.txt
[root@master redirect]# echo this is a test for redirect
this is a test for redirect
[root@master redirect]# echo this is a test for redirect > test.txt
# 创建测试文件,这里使用的是输出重定向,具体细节下面讲,当然用vim编辑器输入也是可以的
# echo 命令为直接屏幕输出文本内容
[root@master redirect]# cat test.txt
this is a test for redirect
# 显示文件内容
[root@master redirect]# cat < test.txt
this is a test for redirect
# 前一条命令为cat的标准用法,这一条命令为将test.txt的内容输入给cat命令,其实原理是一样的。
[root@master redirect]# tr ' ' '\n' < test.txt
this
is
a
test
for
redirect
# 输入重定向,将test.txt的内容输入到命令中并执行该命令
# tr命令为替换,将文本中的空格,替换为\n,即回车
[root@master redirect]# cat > test1.txt < test.txt
# 将test.txt输入到cat命令,使用输入重定向
# 将cat命令的默认输出到屏幕重定向输出到test1.txt中
[root@master redirect]# cat test1.txt
this is a test for redirect

0<< 输入追加重定向,可简写为<<

用法:cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符终止

输入追加重定向最常见的使用方法是将多行文本追加到文件中,其格式为cat > 想要追加到的文件名 <<自定义一个结束符。当输入回车后进入键盘输入状态,按回车可以换行,想结束时手动输入自定义结束符并回车结束多行输入。

[root@master redirect]# cat > test1.txt <<delimiter
> 这里为输入追加重定向第一行
> 这里为输入追加重定向第二行
> 同理第三行
> 第四行
> 下面该结束了
> delimiter
[root@master redirect]# cat test1.txt
这里为输入追加重定向第一行
这里为输入追加重定向第二行
同理第三行
第四行
下面该结束了

标准输出重定向

1> 输出重定向,覆盖原内容,可简写为>

相对输出,理解起来更简单,而且在使用过程中也比输入重定向使用频率要高得多,所以必须要掌握。

用法:cmd > file 将cmd的执行结果(命令执行正确)输出到文件file中

注意:在使用>时,系统会判断文件是否存在,如存在则先删除后新建,如不存在无论左面命令是否成功运行都会直接新建。

[root@master redirect]# >test1.txt
# 因为没有命令,所以将空结果输出到test1.txt。简单说就是清空test1.txt中的内容
[root@master redirect]# cat test1.txt
# 显示结果为空

[root@master redirect]# ls . > test1.txt
# 将ls命令执行结果输出到test1.txt中
[root@master redirect]# cat test1.txt
test1.txt
test.txt

[root@master redirect]# cat > test1.txt
keyboard input and output to test1.txt. press Ctrl+C to end this.
^C
# 键盘输入内容,输出给test1.txt文件,按CTRL + C终止该命令
[root@master redirect]# cat test1.txt
keyboard input and output to test1.txt. press Ctrl+C to end this.

1>> 输出追加重定向,追加到结尾,可简写为>>

同理输出重定向,只是追加到文件末尾。

[root@master redirect]# echo this is new line >> test1.txt
[root@master redirect]# cat test1.txt
keyboard input and output to test1.txt. press Ctrl+C to end this.
this is new line

错误输出重定向

2> 错误输出重定向

原理及用法同输出重定向,只是区别在于标准输出重定向为输出命令执行正确的内容,而错误重定向输出的为命令执行错误的内容。

[root@master redirect]# cat 123.txt
cat: 123.txt: No such file or directory
# 没有这个文件,明显为错误输出
[root@master redirect]# cat 123.txt 1>stdout.txt 2>stderr.txt
# 将标准输出给stdout.txt,将错误输出给stderr.txt
[root@master redirect]# cat stdout.txt
# 查看stdout.txt
[root@master redirect]# cat stderr.txt
cat: 123.txt: No such file or directory
# 查看stderr.txt

[root@master redirect]# cat 456.txt
cat: 456.txt: No such file or directory
# 没有这个文件
[root@master redirect]# cat 456.txt > stdout.txt 2>&1
# 将标准输出给stdout.txt,并将错误输出绑定给标准输出
[root@master redirect]# cat stdout.txt
cat: 456.txt: No such file or directory
# 查看stdout.txt

[root@master redirect]# cat 789.txt &> stdout.txt
# 将标准输出与错误输出都输出到stdout.txt中
[root@master redirect]# cat stdout.txt
cat: 789.txt: No such file or directory

[root@master redirect]# /usr/sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1
# 一般为定时任务中的书写方法,将标准输出和错误输出都输出给null空设备,避免有输出产生
# 定时任务后面会讲到

2>> 错误追加重定向

同理,错误输出追加到文件末尾,可以理解为记录错误日志

[root@master redirect]# >stdout.txt
[root@master redirect]# >stderr.txt
# 清空文件
[root@master redirect]# ls 123.txt 234.txt std* test* 1>stdout.txt 2>stderr.txt
[root@master redirect]# cat stderr.txt
ls: cannot access 123.txt: No such file or directory
ls: cannot access 234.txt: No such file or directory

[root@master redirect]# ls 987.txt 654.txt ~ 1>>stdout.txt 2>>stderr.txt      [
[root@master redirect]# cat stderr.txt
ls: cannot access 123.txt: No such file or directory
ls: cannot access 234.txt: No such file or directory
ls: cannot access 987.txt: No such file or directory
ls: cannot access 654.txt: No such file or directory

特殊符号

#

作用:配置文件中的注释、root用户命令行提示符

演示:

[root@master ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local

;分号

作用:连续不同命令的分隔符

演示:

[root@master tmp]# cd /tmp/;pwd;ls
/tmp
ks-script-xWRBiT
yum.log

|

作用:管道,即将管道前面命令的正确输出信息(对错误输出信息没有直接处理能力)传递给管道后面的命令,使传递的内容作为后面命令的标准输入信息

演示:

[root@master ~]# netstat -lntup | grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      8651/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      8651/sshd 
# 将netstat命令的输出结果,传给后面的命令,grep为过滤,一般搭配管道使用,过滤关键字为22

.

作用:当前目录

演示:

[root@master ~]# ls
anaconda-ks.cfg  redirect  wildcards
# 最后不加目录或文件,默认查看当前目录
[root@master ~]# ls .
anaconda-ks.cfg  redirect  wildcards

..

作用:上一级目录

演示:

[root@master /]# cd /etc/sysconfig/network-scripts/
[root@master network-scripts]# pwd
/etc/sysconfig/network-scripts

[root@master network-scripts]# cd ..
[root@master sysconfig]# pwd
/etc/sysconfig

[root@master sysconfig]# cd ..
[root@master etc]# pwd
/etc

[root@master etc]# cd ..
[root@master /]# pwd
/

~

作用:当前用户的家目录

演示:

[root@master /]# cd ~
[root@master ~]# pwd
/root

-

作用:上一次目录

演示:

[root@master ~]# cd /etc/
[root@master etc]# cd /tmp/
[root@master tmp]# cd -
/etc
[root@master etc]# cd -
/tmp

$

作用:变量标识符、普通用户命令行提示符

演示:

[root@master tmp]# echo $LANG
en_US.UTF-8
# $LANG 为系统变量,表示系统语言

[root@master ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# $PATH 为系统变量,表示系统环境变量

[root@master ~]# echo $PS1
[\u@\h \W]\$
# $PS1 为系统变量,表示命令行开头的结构

[root@master ~]# 
[root@master ~]# echo $P

[root@master ~]# P=5
[root@master ~]# echo $P
5
# $P 为自定义变量

/

作用:路径分隔符,单独使用表示根目录

演示:

[root@master ~]# cd /etc/sysconfig/network-scripts/
[root@master network-scripts]# pwd
/etc/sysconfig/network-scripts

[root@master ~]# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

\ (反斜杠)

作用:转义后面单个字符、屏蔽命令的别名

演示:

PS: 下面的单引号、双引号及不加引号一起演示

[root@master network-scripts]# echo \n \$LANG $LANG $(which mkdir) {01..05}
n $LANG en_US.UTF-8 /usr/bin/mkdir 01 02 03 04 05
# 内容不加引号,解析反斜杠;解析变量;解析通配符
# 强制解析反斜杠:\n输出n;\$LANG输出$LANG
# 解析变量:$LANG输出系统变量$LANG;$(which mkdir)输出which mkdir命令的执行结果
## whick mkdir命令为查询mkdir命令的所在路径
# 解析通配符:解析{01..05},输出01 02 03 04 05

[root@master network-scripts]# echo '\n \$LANG $LANG $(which mkdir) {01..05}'
\n \$LANG $LANG $(which mkdir) {01..05}
# 内容加单引号,所见即所得,输入什么输出什么,不做解析

[root@master network-scripts]# echo "\n \$LANG $LANG $(which mkdir) {01..05}" 
\n $LANG en_US.UTF-8 /usr/bin/mkdir {01..05}
# 内容加双引号,解析变量后输出,不解析\n,不解析通配符
# 解析反斜杠非转义字符:因“\n”为转义字符,有回车的含义,所以未将转义字符解析,输出\n;\$非转义字符,\$LANG输出$LANG
# 解析变量:$LANG输出系统变量$LANG;$(which mkdir)输出which mkdir命令的执行结果
# 不解析通配符,{01..05}输出{01..05}

[root@master network-scripts]# echo -e "\n \$LANG $LANG $(which mkdir) {01..05}"

 $LANG en_US.UTF-8 /usr/bin/mkdir {01..05}
# echo命令的-e选项,为激活转义字符,则\n输出回车换行,其他内容不变

[root@master ~]# alias
alias cp='cp -i'
......
# 查看系统别名,只显示cp别名,其他内容略
# 即cp用在行首时,输入cp命令,默认相当于输入cp -i命令,自带-i选项
# -i选项为:覆盖既有文件之前先询问用户
[root@master ~]# touch testcp
# 创建测试文件
[root@master ~]# cp testcp testcpcp
# 复制测试文件
[root@master ~]# cp testcp testcpcp
# 再次复制测试文件
cp: overwrite ‘testcpcp’? y
# 存在该文件,因自带-i选项,所以弹出覆盖提示
[root@master ~]# \cp testcp testcpcp 
# 忽略cp命令别名,使用无任何选项的cp命令,即无任何提示覆盖

' ' (单引号)

作用:输出所见即所得

演示见\ (反斜杠)部分演示

" " (双引号)

作用:解析变量后输出

演示见\ (反斜杠)部分演示

` ` (反引号)

作用:TAB按键上面的按键,反引号中间为命令,会优先执行,等价于$()

演示:

[root@master ~]# echo `which mkdir`
/usr/bin/mkdir
[root@master ~]# echo $(which mkdir)
/usr/bin/mkdir

[root@master ~]# echo `date`
Mon Nov 5 17:26:04 CST 2018
[root@master ~]# echo $(date)
Mon Nov 5 17:26:21 CST 2018

!

作用:逻辑非(not)

演示:

[root@master ~]# ls wildcards/
ks1  ks2  ks3  ks4  ks5
[root@master ~]# find wildcards/ -type f -name "ks1"  
wildcards/ks1
[root@master ~]# find wildcards/ -type f ! -name "ks1"
wildcards/ks2
wildcards/ks3
wildcards/ks4
wildcards/ks5
# find命令很重要,后面会详细讲
# 第一个find命令表示查找类型为文件,名字为ks1的文件
# 第二个find命令表示查找类型为文件,名字非ks1的文件

&

作用:放在命令最后,让程序或脚本切换到后台执行

演示:

[root@master ~]# echo 123 &
[1] 41704
[root@master ~]# 123

[1]+  Done                    echo 123
# 将echo 123放在后台运行,并输出后台进程号及执行情况

[root@master ~]# yum -y update >/dev/null 2>&1 &   
[1] 41733
[root@master ~]# 
# 切换到后台执行,再将输出内容发给空设备,即屏幕无输出内容

&&

作用:当前一个命令执行成功时,执行后一个命令。并且的意思(and)

演示:

[root@master ~]# pwd
/root
[root@master ~]# mkdir test && cd test
# 先创建目录,创建目录成功则进入该目录
[root@master test]# pwd
/root/test

[root@master ~]# ifdown eth1 && ifup eth1 && echo My name is gaoqichen
# 禁用eth1网卡;成功禁用后开启eth1网卡,实现重启网卡的动作;成功后自定义输出
Device 'eth1' successfully disconnected.
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/57)
My name is gaoqichen

||

作用:当前一个命令执行失败时,执行后一个命令。或者的意思(or)

演示:

[root@master ~]# ls
anaconda-ks.cfg  redirect  test  wildcards
[root@master ~]# cat 123.txt || touch 123.txt
# 显示123.txt文件内容,如果报错(不存在)则新建123.txt文件
cat: 123.txt: No such file or directory
[root@master ~]# ls
123.txt  anaconda-ks.cfg  redirect  test  wildcards
Last modification:May 28th, 2020 at 10:54 am
If you think my article is useful to you, please feel free to appreciate