前言
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