首页 > 代码库 > shell 中特殊符号
shell 中特殊符号
在学习linux的过程中,也许你已经接触过某个特殊符号,例如”*”,它是一个通配符号,代表零个或多个字符或数字。下面阿铭就说一说常用到的特殊字符。
* 代表零个或多个任意字符。
[root@localhost ~]# ls -d test* test test1 test2 test3
? 只代表一个任意的字符
[root@localhost ~]# touch testa [root@localhost ~]# touch testb.txt [root@localhost ~]# ls -d test? test1 test2 test3 testa
不管是数字还是字母,只要是一个都能匹配出来。
# 这个符号在linux中表示注释说明的意思,即 # 后面的内容linux忽略掉。
[root@localhost ~]# abc=123 #aaaaa [root@localhost ~]# echo $abc 123
\ 脱意字符,将后面的特殊符号(例如”*” )还原为普通字符。
[root@localhost ~]# ls -d test\*ls: 无法访问test*: 没有那个文件或目录
| 管道符,前面多次出现过,它的作用在于将符号前面命令的结果丢给符号后面的命令。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk为正则表达式必须掌握的工具,在后续内容中详细介绍。
[root@localhost ~]# cat testb.txt |wc -l 0
wc -l 用来计算一个文档有多少行。在这里阿铭一下子列出来很多对你陌生的命令,其实这些命令在日常的处理文档工作中非常实用,所以阿铭需要先简单介绍一下它们,如果你记不住没有关系,以后用到的时候再过来查或者直接用man来查询帮助文档。
特殊符号$
$除了用于变量前面的标识符外,还有一个妙用,就是和“!”结合起来使用。
[root@localhost ~]# ls 1.txt
1.txt
[root@localhost ~]# ls !$
ls 1.txt
1.txt
!$标识上一条命令中最后一个变量。
特殊符号 ;
运行两条命令以上的命令,命令中间用“;”隔开
特殊符号 ~
用户的家目录,如果是root则是/root,普通用户则是/home/username
特殊符号 &
让命令在后台运行,加在命令后面。
通常用于命令运行时间非常长的情况。
重定向符号 > >> 2> 2>>
>取代 >>追加
2>错误重定向
2>>错误追加重定向
中括号[ ]
中间为字符组合,代表中间字符中的任意一个。
详见P164~167
$ 除了用于变量前面的标识符外,还有一个妙用,就是和 ‘!’ 结合起来使用。
[root@localhost ~]# ls testb.txt testb.txt [root@localhost ~]# ls !$ ls testb.txt testb.txt
‘!$’ 表示上条命中中最后一个变量(总之就是上条命令中最后出现的那个东西)例如上边命令最后是testb.txt那么在当前命令下输入!$则代表testb.txt.
; : 分号。平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个 ”;” 了。
[root@localhost ~]# ls -d test*; touch test111; ls -d test* test test1 test2 test3 testa testb.txt test test1 test111 test2 test3 testa testb.txt
~ : 用户的家目录,如果是root则是 /root ,普通用户则是 /home/username
[root@localhost ~]# cd ~ [root@localhost ~]# pwd /root [root@localhost ~]# su test [test@localhost root]$ cd ~ [test@localhost ~]$ pwd /home/test
& : 如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。
[root@localhost ~]# sleep 30 & [1] 3260 [root@localhost ~]# jobs [1]+ Running sleep 30 &
>, >>, 2>, 2>> 前面讲过重定向符号> 以及>> 分别表示取代和追加的意思,然后还有两个符号就是这里的2> 和 2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用2>或者2>>
[root@localhost ~]# ls aaaals: 无法访问aaaa: 没有那个文件或目录[1]+ Done sleep 30 [root@localhost ~]# ls aaaals: 无法访问aaaa: 没有那个文件或目录[root@localhost ~]# ls aaaa 2> /tmp/error [root@localhost ~]# cat /tmp/errorls: 无法访问aaaa: 没有那个文件或目录[root@localhost ~]# ls aaaa 2>> /tmp/error [root@localhost ~]# cat /tmp/errorls: 无法访问aaaa: 没有那个文件或目录 ls: 无法访问aaaa: 没有那个文件或目录
[ ] 中括号,中间为字符组合,代表中间字符中的任意一个。
[root@localhost ~]# ls -d test* test test1 test111 test2 test3 testa testb.txt [root@localhost ~]# ls -d test[1-3] test1 test2 test3 [root@localhost ~]# ls -d test[1a3] test1 test3 testa [root@localhost ~]# ls -d test[0-9] test1 test2 test3 [root@localhost ~]# ls -d test[0-9a-z] test1 test2 test3 testa
&& 与 ||
在上面刚刚提到了分号,用于多条命令间的分隔符。另外还有两个可以用于多条命令中间的特殊符号,那就是 “&&” 和 “||” 下面把这几种情况全列出:
command1 ; command2
command1 && command2
command1 || command2
使用 ”;” 时,不管command1是否执行成功都会执行command2;
使用 “&&” 时,只有command1执行成功后,command2才会执行,否则command2不执行;
使用 “||” 时,command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行。
在做实验前,阿铭想把所有的 test* 删除掉,可是删除的时候,却提示说权限不够,下面是阿铭排除问题的过程:
[root@localhost ~]# rm -rf test* rm: 无法删除"test2/test1": 权限不够 rm: 无法删除"test2/test3": 权限不够 rm: 无法删除"test2/test4": 权限不够 [root@localhost ~]# ls test* test1 test3 test4 [root@localhost ~]# lsattr test* -----a-------e- test2/test1 ----i--------e- test2/test3 -------------e- test2/test4 [root@localhost ~]# chattr -a test2/test1 [root@localhost ~]# chattr -i test2/test3 [root@localhost ~]# rm -rf test* rm: 无法删除"test2/test1": 权限不够 rm: 无法删除"test2/test3": 权限不够 rm: 无法删除"test2/test4": 权限不够 [root@localhost ~]# ls test* test1 test3 test4 [root@localhost ~]# ls -ld test* drwxrwxr-x 2 root root 4096 5月 10 10:12 test2 [root@localhost ~]# ls -l test2/* -rw-r--r-- 1 root root 6 5月 10 10:20 test2/test1 -rw-r--r-- 1 root root 0 5月 10 10:11 test2/test3 -rw-r--r-- 1 root root 0 5月 10 10:12 test2/test4 [root@localhost ~]# lsattr test2/* -------------e- test2/test1 -------------e- test2/test3 -------------e- test2/test4 [root@localhost ~]# lsattr test2 -------------e- test2/test1 -------------e- test2/test3 -------------e- test2/test4 [root@localhost ~]# lsattr -d test2 ----i--------e- test2 [root@localhost ~]# chattr -i test2/ [root@localhost ~]# rm -rf test2/
如果你之前跟着阿铭做过同样的实验,相信你也会出现同样的问题的。接下来阿铭要通过做实验来说明 “&&” 与 “||” 这两个特殊符号的作用:
[root@localhost ~]# touch test1 test3 [root@localhost ~]# ls test2 && touch test2 ls: 无法访问test2: 没有那个文件或目录 [root@localhost ~]# ls test2 ls: 无法访问test2: 没有那个文件或目录 [root@localhost ~]# ls test2 || touch test2 ls: 无法访问test2: 没有那个文件或目录 [root@localhost ~]# ls test* test1 test2 test3
本文出自 “12350027” 博客,谢绝转载!
shell 中特殊符号