@Chiang
2020-02-02T14:33:29.000000Z
字数 3281
阅读 575
Linux
Shell
Shell 中除使用普通字符外,还使用了一些特殊字符,它们有特定的含义,也有着重要的作用,如通配符、单引号、双引号、管导线等。在使用时应该注意它们表示的意义和作业范围。
通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。常用的通配符有如下几种:
它匹配任意个字符串,在搜索文件时经常使用。但应该注意的是,星号不能匹配文件名前的圆点 . 和路径名中的斜杠 / ,所以应用中必须显示。例如,模式 “ file” 不能匹配 “.profile”,而需要用 “. file” 才可匹配。
它匹配任意一个字符。例如,“f?” 可以匹配 f1、fa 等。
方括号中有一对字符组。其作用是匹配该字符组所限定的任何一个字符。例如,”f[abcd]” 可以匹配 fa、fb、fc、fd,但不能匹配 fab、fabcd 等。方括号中的字符可以由直接给出的字符组成,也可以由表示范围的起始字符、终止字符及中间一个字符(-)组成。例如,“f[a-d]” 与 “f[abcd]” 作用相同。很明显,前者表示方式更便捷。
如果它紧跟在一对方括号的左方括号之后,则表示不包括在方括号中所列出的字符。例如,“f[!a-d].c” 表示以 f 打头、第二个字符不是 a 到 d 的 .c 文件名。
在一个表达式中,也可以同时使用上述符号来提高工作效率。这里要特别强调一点, 通配符与正则表达式很相似,使用时应该注意两者的区别,正则表达式比通配符更加强大 。
在 Shell 中引号分为三种:即双引号、单引号和倒引号。
由双引号括起来的字符,除$、倒引号和反斜杠(\)仍然保留其特殊功能外,其余字符通常作为普通字符对待。示例:
#!/bin/bash
# Filename: test3-1.sh
# Author: huoty <sudohuoty@163.com>
# Script starts from here:
echo "My current directory is `pwd`"
echo "My home the directory is $HOME \n"
注意: 双引号一定为英文的双引号(”“),而不能为中文的双引号(“”),本节中所讨论的所有特殊字符都是英文符号。
由单引号括起来的所有字符或字符串都作为普通字符出现。如果将上例中的双引号改为单引号,则 pwd 和 $HOME 就会作为普通字符输出,而失去原有的特殊意义。总结的说就是,被单引号括起来的字符,是什么就输出什么。
倒引号括起来的字符串被 Shell 解释为命令行,在执行时,Shell 会先执行该命令行,并以它的标准输出结果取代整个倒引号部分。常用的方式有以下几种:
$ echo current directory is `pwd` current directory is /home/huoty
由上可见,Shell 在执行此命令时,先执行 `pwd` 中的命令 pwd,然后用执行结果取代 pwd 部分,最后输出输出替换后的结果。
#!/bin/bash
# Filename: test3-2.sh
# Author: huoty <sudohuoty@163.com>
# Script starts from here:
mypath=`pwd`
echo My directory is $mypath
#!/bin/bash
# Filename: test3-2.sh
# Author: huoty <sudohuoty@163.com>
# Script starts from here:
mypath=`echo My directory is \`pwd\``
echo $mypath
在之前的示例程序中,我们大都是一行执行一个命令,而事实上,多条命令可以在一行中出现,顺序执行。相邻命令间也可以存在逻辑关系,即 逻辑“与” 和 “或”。
多条命令可以在多行中输入,也可以将这些命令在一行中输入,但各命令应以分号(;)隔开,例如在本教程中的第一个例子可以用如下方式实现:
$ pwd; ls -l ~/.vimrc; cal; who; ifconfig
管道的作用是将前边命令的输出作为后边命令的输入。用管道线 “|” 可以将多个简单的命令集合在一起,用以完成较复杂的功能。管道的执行顺序也是顺序执行。例如:
$ who | wc -l | write username
上例的含义是统计在线人数,并把结果以消息形式发送给 username 用户。
罗辑与操作符 “&&” 可把两个或两个以上命令联系在一起,格式如下:
command1 && command2 && … && commandN
功能: 先运行 command1,如果结果运行成功,才运行 command2;否则若 command1 运行不成,则不运行 command2。依次类推,只有前 n-1 个命令都正确运行后,第 n 个命令才运行。示例:
$ cp test1 /home/huoty/ && cat /home/huoty/test1
如果成功复制 test1 到要求路径,则查看其内容。 注: 在 Shell 中,命令执行成功返回值为 0, 执行失败返回值为非 0。
罗辑或操作符 “||” 可以把两个或两个以上命令联系起来,其一般格式为:
command1 || command2 || … || commandN
功能: 先运行 command1,如果运行不成功,则运行 command2;否则若 command1 运行成功,则不运行 command2。示例:
cp test1 /home/huoty || ls -l
如果没有成功复制 test1 文件到要求路径,则查看当前路径内容。
在 UNIX/Linux 中,使用 “#” 来进行 Shell 程序的注释。为了让编写的程序更容易让人理解,应该养成在程序中添加注释的好习惯,注释用于描述一组特定命令的用途。
\
)反斜杠(\)是转义字符,它能把特殊字符编程普通字符。例如:
echo “Filename is No\$ * n1” Filename is No$ * n1
如果想要在字符串中使用反斜杠本身,则必须采用 “\” 的形式,其中第一个反斜杠作为转义字符,从而第二个反斜杠变为普通字符。
另外,反斜杠还作为续行符使用。如果把它放在一行的回车符换行之前,那么表示下一行接续此行被视为同一行,可以用于表示长的输入行。
有些程序的运行会花很长时间,或者要保持一直运行。这样它们就会一直占着 Shell 终端,而我们也无法做其他的事情。我们可以把进程放到后台去执行,后台运行程序的方法是,在命令后加上后台运行操作符 & 。利用前后台进程轮流在 CPU 上执行,可以提高工作效率,并且充分地利用了系统资源。例如在编译一个大型 C 程序项目时,如果想要再编译的同时做点别点事情,可以用诸如以下的方式:
gcc file1.c &
在一条命令最后输入 & 符号,Shell 就再后台启动该程序,并且马上显示主提示符。用 jobs 命令可以查看挂起在后台的进程。用 fg 命令可以将后台挂起的进程恢复到前台来运行。用快捷键 Ctrl + Z 可以暂时把当前程序挂起到后台,挂起后的进程将不再进行任何操作。
参考资料:
Shell 程序设计教程