1. 与路径有关的特殊符号
1.1 波浪线 ~
代表用户的家目录,普通用户为 /home/username,root 用户为 /root。
[admin@node ~]$ cd ~
[admin@node ~]$ pwd
/home/admin
[root@node ~]# cd ~
[root@node ~]# pwd
/root
1.2 中划线 -
代表用户所在的上一个目录
$ pwd
/home/admin
$ cd /tmp
$ cd /opt
$ cd -
/tmp
$ cd -
/opt
说明:- 其实是引用了 OLDPWD 这个环境变量中记录的上一级目录
[admin@node ~]$ echo $OLDPWD
/tmp
1.3 点 .
代表当前目录
$ pwd
/home/admin
$ cd .
$ pwd
/home/admin
$ find . -type f
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history
./.zinc/0.3.15/compiler-interface-2.11.12-52.0/compiler-interface.jar
./log.txt
./.viminfo
./err.txt
./file.txt
1.4 双点 ..
代表上一级目录
[admin@node ~]$ mkdir dir
[admin@node ~]$ cd dir
[admin@node dir]$ pwd
/home/admin/dir
[admin@node dir]$ cd ..
[admin@node ~]$ pwd
/home/admin
2. 引号系列
2.1 反引号 ` 和 $()
作用:当待处理的字符串用反引号引起来的时候,系统会首先将反引号里的字符串当做命令进行解析。
$ date
Sun Jul 2 14:54:27 CST 2023
$ echo date
date
$ echo `date`
Sun Jul 2 14:54:40 CST 2023
$ echo `aa`
-bash: aa: command not found
$ touch `date +%F`.txt
$ ls
2023-07-02.txt
$ ls -l `which cat`
-rwxr-xr-x 1 root root 54080 Nov 17 2020 /usr/bin/cat
# 反引号与 $() 的作用相同
$ echo $(date)
Sun Jul 2 14:57:28 CST 2023
2.2 单引号 '
特点:强引用,输出的信息“所见即所得”。
$ echo '$LANG'
$LANG
$ echo '`date`'
`date`
2.3 双引号 "
特点:弱引用,如果双引号中的内容有变量的引用、反引号括着的命令、转义字符,则要先把变量、命令和转义字符解析出结果,然后再输出最终内容。
$ echo "$LANG"
en_US.UTF-8
$ echo "`date`"
Sun Jul 2 15:02:38 CST 2023
2.4 无引号
无引号,和双引号的作用类似,但是由于没有引号,很难确定字符串的边界,因为操作很容易出现各种未知的错误。
$ echo "today is `date +%F`"
today is 2023-07-02
$ echo today is `date +%F`
today is 2023-07-02
$ touch hello world.txt
$ ll
-rw-rw-r-- 1 admin admin 0 Jul 2 15:08 hello
-rw-rw-r-- 1 admin admin 0 Jul 2 15:08 world.txt
$ touch "hello world.txt"
$ ll
-rw-rw-r-- 1 admin admin 0 Jul 2 15:08 hello
-rw-rw-r-- 1 admin admin 0 Jul 2 15:08 hello world.txt
-rw-rw-r-- 1 admin admin 0 Jul 2 15:08 world.txt
注意:双引号无法识别有些通配符的信息,这是只能使用无引号
$ echo "{1..3}"
{1..3}
$ echo {1..3}
1 2 3
3. 重定向符号
标准输入(stdin),代码:0
标准输出(stdout),代码:1
标准错误输出(stderr),代码:2
# 标准输出重定向
# 覆盖写
$ echo hello 1>log.txt
$ cat log.txt
hello
$ echo world 1>log.txt
$ cat log.txt
world
$ echo nihao 1>>log.txt
$ cat log.txt
world
nihao
# 代码 1 可以省略
$ echo mmm >log.txt
$ echo nnn >>log.txt
mmm
nnn
# 标准错误输出重定向
$ cho 2>err.txt
$ cat err.txt
-bash: cho: command not found
# 将标准输出和标准错误输出输出(覆盖)到不同文件中
$ echo "stdout" 1>stdout.txt 2>stderr.txt
$ cat stdout.txt
stdout
$ ech "stdout" 1>stdout.txt 2>stderr.txt
$ cat stderr.txt
-bash: ech: command not found
# 将标准输出和标准错误输出输出(以追加为例)到一个文件中的 3 种方法
$ echo "stdout and stderr" 1>>echo.log 2>>echo.log
# 这个命令的意思是,将标准错误输出重定向到标准输出,标准输出重定向到文件中
$ echo "stdout and stderr" >>echo.log 2>&1
$ echo "stdout and stderr" &>>echo.log
# 标准输入重定向
# 将标准输入重定向到 stdout.txt,即将 stdout.txt文件中的内容作为输入,然后输出到标准输出
$ echo 1 2 3 > stdout.txt
$ cat 0<stdout.txt
1 2 3
# 0 可以省略
$ cat <stdout.txt
1 2 3
# 标准输入重定向案例1:将文件中内容作为标准输入,替换空格为换行符
$ tr " " "\n" <stdout.txt
1
2
3
# 标准输入重定向案例2:将文件中内容作为标准输入,传递给 xargs 参数进行转换
$ xargs -n 1 <stdout.txt
1
2
3
# 标准输入重定向案例3:使用标准输入重定向功能发送邮件
# mail?-s '邮件标题内容' 收件人地址 <邮件内容
$ mail?-s '服务器hosts文件内容' tom@qq.com </etc/hosts
# 标准输入重定向案例4:向文件中写入多行内容
~ cat >file.txt <<EOF
> Hello World
> Hello Linux
> EOF
4. 逻辑操作符
| 选项 | 说明 |
|---|---|
| && | 前一个命令执行成功,再执行后一个命令 |
| || | 前一个命令执行失败,再执行后一个命令 |
| ! | 取反 |
# 创建 ~/dir3 目录并且在该目录下创建一个 log.txt 文件
# 在创建目录成功后,再创建文件
mkdir -p ~/dir3 && touch ~/dir3/log.txt
# 无论前一条命令执行成功与否,后一条命令都会执行
mkdir -p ~/dir3 ; touch ~/dir3/log.txt
$ cho "执行成功" && echo "执行失败"
-bash: cho: command not found
$ cho "执行成功" || echo "执行失败"
-bash: cho: command not found
执行失败
# 取反
# 在当前目录下查找修改时间比 file1.txt 新但比 file2.txt 旧的文件
$ find . -newer file1.txt ! -newer file2.txt
5. 其他特殊符号
5.1 美元符 $
作用一:普通用户的命令提示符
命令之前的一整个字符串称作命令提示符,即:[admin@node ~]$ 是一个命令提示符,其中:
admin是当前登录的用户名node是主机名@是用户名和主机名之间的分隔符~代表目前所在的目录是用户的家目录,如果不是用户的家目录,就是显示上一级目录名$是普通用户命令提示符的结尾符,root 用户命令提示符的结尾符号是#
作用二:取出变量中的内容
$ VAR=123
$ echo $VAR
123
作用三:awk 命令取出指定列的信息
$ cat hello.txt
Hello World
$ awk '{print $2}' hello.txt
World
5.2 感叹号 !
作用一:表示取反或者排除
# 在当前目录下查找修改时间比 file1.txt 新但比 file2.txt 旧的文件
$ find . -newer file1.txt ! -newer file2.txt
作用二:取出最近的命令并执行
[admin@node ~]$ ls .
dir err.txt file.txt log.txt
[admin@node ~]$ ls -l .
total 8
drwxrwxr-x 2 admin admin 6 Jul 2 16:25 dir
-rw-rw-r-- 1 admin admin 30 Jul 2 16:01 err.txt
-rw-rw-r-- 1 admin admin 24 Jul 2 16:13 file.txt
-rw-rw-r-- 1 admin admin 0 Jul 2 16:00 log.txt
# 找出最近一次以 ls 开头的命令并运行
[admin@node ~]$ !ls
ls -l .
total 8
drwxrwxr-x 2 admin admin 6 Jul 2 16:25 dir
-rw-rw-r-- 1 admin admin 30 Jul 2 16:01 err.txt
-rw-rw-r-- 1 admin admin 24 Jul 2 16:13 file.txt
-rw-rw-r-- 1 admin admin 0 Jul 2 16:00 log.txt
作用三:表示强制操作处理
vim 编辑文件后,使用 wq! 强制保存并退出,使用 q! 强制退出。
5.3 管道符 |
管道符:在命令和命令之间需要用管道符衔来处理数据流,常与 xargs 命令一起使用。
注意: 管道符虽然使用方便,但效率不高,执行命令时能一次出结果就不要使用管道符多次处理。
案例1:找到符合条件的文件进行删除
find / -type f -name "app_log*.log" | xargs rm
find / -type f -name "app_log*.log" -exec rm -rf {} \;
find / -type f -name "app_log*.log" -delete
说明:xargs 命令后面的命令会自动使用原始命令而不用别名,所以执行 rm 命令不需要加 -f 选项也没有打印确认信息。
案例2:找到符合条件的文件进行移动
find / -type f -name "app_log*.log" | xargs -i mv {} /tmp
find / -type f -name "app_log*.log" | xargs mv -t /tmp
find / -type f -name "app_log*.log" -exec mv {} /tmp \;
5.4 井号 #
作用一:root 用户的命令提示符
[root@node ~]#
[admin@node ~]$
作用二:注释
[admin@node ~]$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
5.5 分号 ;
如果需要一次执行多条命令,可以在命令之间使用 ; 连接。
$ echo "执行命令 pwd 开始" ; pwd ; echo "执行命令 pwd 结束"
执行命令 pwd 开始
/home/admin
执行命令 pwd 结束
5.6 大括号 {}
作用一:生成序列
$ echo {1..3}
1 2 3
$ echo {a..c}
a b c
$ echo A{1..3}
A1 A2 A3
# 逗号分隔,列出来
$ echo {h,e,l,l,o}
h e l l o
$ echo A{,B}
A AB
# 生成的序列补零
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
$ echo {01..100}
001 002 003 004 005 ... 100
# 设置步长
$ echo {1..10..2}
1 3 5 7 9
$ echo {2..10..2}
2 4 6 8 10
# 组合序列
$ echo {a..c}{1..2}
a1 a2 b1 b2 c1 c2
$ echo {a..b}{1..2}{c..d}
a1c a1d a2c a2d b1c b1d b2c b2d
应用:快速备份文件
$ sudo cp /etc/ssh/sshd_config{,.bak}
$ ls /etc/ssh | grep sshd_config
sshd_config
sshd_config.bak
# 还原
sudo mv /etc/ssh/sshd_config{.bak,}
作用二:变量分隔符
$ str="hello"
$ echo $str_world
$ echo ${str}_world
hello_world
5.8 &
待完善
6. 通配符
通配符通常用于基于模糊匹配的规则来查找文件,通配符是 bash 的内置功能,几乎适用于所有的 Linux 命令。
6.1 *
匹配任意字符(0个或多个,包括空字符串)
$ ls
dir dir3 err.txt file.txt log.txt
$ rm -f *.txt
$ ls
dir dir3
6.2 ?
匹配任意一个字符
$ touch a.txt aa.txt aaa.txt
$ ls ?.txt
a.txt
$ ls ??.txt
aa.txt
$ ls ???.txt
aaa.txt
6.3 []
作用:匹配中括号的任意一个字符
$ ls
a.txt c.txt e.txt g.txt i.txt k.txt m.txt o.txt q.txt s.txt u.txt w.txt y.txt
b.txt d.txt f.txt h.txt j.txt l.txt n.txt p.txt r.txt t.txt v.txt x.txt z.txt
# 匹配 abc 这 3 个字符中的任意一个字符
$ ls [abc].txt
a.txt b.txt c.txt
# 匹配 a-g 这个范围内的字符中的任意一个字符
$ ls [a-g].txt
a.txt b.txt c.txt d.txt e.txt f.txt g.txt
6.4 取反 ! 和 ^
# 匹配除 abc 这 3 个字符外的任意一个字符
$ ls [!abc].txt
d.txt f.txt h.txt j.txt l.txt n.txt p.txt r.txt t.txt v.txt x.txt z.txt
e.txt g.txt i.txt k.txt m.txt o.txt q.txt s.txt u.txt w.txt y.txt
$ ls [^abc].txt
d.txt f.txt h.txt j.txt l.txt n.txt p.txt r.txt t.txt v.txt x.txt z.txt
e.txt g.txt i.txt k.txt m.txt o.txt q.txt s.txt u.txt w.txt y.txt
# 匹配在 [a-w] 这个范围之外的任意一个字符
$ ls [!a-w].txt
x.txt y.txt z.txt
$ ls [^a-w].txt
x.txt y.txt z.txt
练习:在 /etc 目录下查找文件,要求文件名的第一个字符是任意字符,第二个字符是 o、p、q 这 3 个字符中的任意一个,第三个字符不能是 a-r 之间的任意一个,结尾是 ts。
find /etc -type f -name "?[opq][^a-r]ts"