今天我们来说一下,shell中的特殊符号。
一、Bash的特殊符号
1、双单引号
' '
:单引号。在单引号中所有的特殊符号,如$
和" ` "(反引号)都没有特殊含义。
2、双引号
" "
:双引号。在双引号中特殊符号都没有特殊含义,但是$
、" ` "和\
除外,这三个符号是有特殊含义的,拥有“调用变量的值”、“引用命令”和“转义符"的特殊含义。
- 单引号和双引号的区别举例:
3、$
符号
$
:用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
在Linux系统中,定义一个变量非常简单,直接用变量名=变量值
的格式定义变量就可以了。而我们在查看变量值的时候,使用$变量名
就可以查看到。如下图,用echo命令查看变量name的值,如果我们不加$
,echo命令会认为要输出name字符串,如果在name前加上$符号,echo命令就会输出变量name的值。请看下图:
4、反引号
" ` ` ":反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$( )
作用一样,不过推荐使用$( )
,因为反引号非常容易看错。
5、$( )
符号
$( )
:和反引号作用一样,用来引用系统命令。
如果我们直接从命令行中执行一个系统命令(如date命令),这个时候命令是不用$( )
符号括起来的,因为shell是可以直接调用系统命令的。
那什么时候需要把系统命令括起来呢?
如定义一个变量a,需要把date命令的结果,赋值给a的时候,如a=date
。这个时候就需要让date命令先运行,再把所得到的值赋值给变量a。如下图:
上图中可以看到,如果date命令不加反引号,shell会认为把date字符串赋值给a变量。
总结:也就是说,只有需要把命令的结果赋值于变量的时候,才需要用反引号或者
$( )
符号把命令括起来。任何命令的结果都可以赋值给变量,只要命令的结果有输出,像cd命令就不可以。
推荐使用$( )
代替反引号。
练习:把root目录下所有文件的文件名存入变量b中。
综合练习:
6、#
符号
#
:在Shell脚本中,#开头的行代表注释。
7、\
符号
\
:转义符,跟在\
之后的特殊符号将失去特殊含义,变为普通字符。如\$name
将输出$name
符号,而不当做是变量引用。
8、( )
小括号
( )
:用于一串命令执行时,( )
中的命令会在子Shell中运行。(和下面大括号一起说明)
9、{ }
大括号
{ }
:用于一串命令执行时,{ }
中的命令会在当前Shell中执行。也可以用于变量变形与替换。
(1)在介绍小括号和大括号的区别之前,我们先要解释一个概念,那就是父Shell和子Shell。
用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令声明变量,也可以创建并运行 shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来 说,用户可以有许多shell,每个shell都是由某个shell(称为父shell)派生的。
在Linux系统中的默认shell是bash,在bash中是可以调用新的bash的。在开启远程终端时候所启动的默认的交互shell就是父shell,只需要直接执行bash
命令,就会创建一个新的shell,这个shell就是子shell。
如下:
执行[root@localhost ~ ] # bash
,我们就开启一个子shell。
(2)要区分是父shell还是子shell,需要使用前面所学的ps
命令,查看进程命令来进行判断。
- 执行
ps -f
查看系统进程。
- 执行
bash
命令,开启一个新的shell,并再次查看系统进程。
可以看到上图中,第二个进程的父id是第一个进程,所以第二个进程的bash是子shell。
- 退出子shell,并再次查看系统进程。
可以看到子shell进程结束,消失了。
(3)我们可以通过pstree
命令(查看进程树),来查看父子shell的关系。
在Red Hat 6 中,所有的进程都是init进程的子进程。如下图:
我们可以看到在init进程下,开启了一个sshd的进程,这个进程就是远程登陆进程。我们执行过一次远程登陆sshd,和开启bash功能,在此bash下执行过一次pstree
命令。
在当前shell中,再执行一边bash
命令,再次执行pstree
命令(查看进程树)。
如下图:
我们可以从上图中看到,我在第一个bash下,又开启了一个新的bash,在新bash中执行了pstree
命令。
所以说第一个bash是父(也就是父shell),第二个bash是子(也就是子shell)。
(4)父子shell的关系拓展。
父shell可以创建子shell,在子shell中还可以创建自己的子shell。
它们的关系如下图所示:
下面来演示下这个关系图的shell创建,和它们之前的关系层次。
下图中又创建了二个子shell,总共三个子shell。依次是子shell, 孙shell, 曾孙shell。
下图使用ps -f
命令,通过PPID列出谁是谁的父进程。
注意:生成子shell的成本不低,而且速度还慢,创建嵌套的子shell去处理命令进程性能更为严重。
通过输入exit
命令能有条不絮的退出子shell,例如上面的三个子shell, 首先从曾孙shell退出, 如下图所示:
注意:当没有了子shell时,再输入exit
命令,将退出控制台终端。
(5)知道了父Shell和子Shell的关系,我们接着解释小括号和大括号的区别。
小括号和大括号的主要区别在于,在shell程序执行的时候,小括号或者大括号中的内容是在父shell执行还是在子shell中执行。
下面我们总结一下小括号和大括号的主要区别:
( )
中执行一串命令时,需要重新开一个子shell进行执行。
在当前shell中name=ss,当执行到( )
中命令的时候,会自动开启一个子shell,在子shell中name的变量赋予了mm,当( )
中命令运行完,子shell进程就结束了,进程消失。里边的变量都不会保存,并自动返回到父shell中,也就是回归到当前shell,name的值还是原来shell中赋予的ss值。示例如下:
#在父Shell中定义变量name的值是ss
[root@localhost ~] # name=ss
#如果用()括起来一串命令,这些命令都可以执行。
#给name变量重新赋值,但是这个值只在子Shell中生效
[root@localhost ~ ] #(name=mm;echo $name)
mm
#父Shell中name的值还是ss,而不是mm
[root@localhost ~ ] # echo $name
ss
{ }
中执行一串命令时,是在当前shell执行。
#用大括号来进行串命令的执行时
#name变量的修改是直接在父Shell当中的
#注意大括号的格式
[root@localhost ~ ] # { name=mm;echo $name; }
mm
#所以name变量的值已经被修改了
[root@localhost ~ ] # echo $name
mm
就相当于直接在当前shell执行{ }
中的语句,那么不写{ }
的结果是一样的。
( )
和{ }
都是把一串的命令放在括号里面,并且命令之间用;
号隔开。( )
最后一个命令可以不用分号结尾。[root@localhost ~ ] # ( name=lm; echo $name )
{ }
中最后一个命令要用分号结尾。[root@localhost ~ ] # { 空格 name=lm; echo $name; }
{ }
中的第一个命令和左括号之间必须要有一个空格;[root@localhost ~ ] # { 空格 name=lm; echo $name; }
( )
里的各命令不必和括号有空格;( )
和{ }
中,括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令。
小括号和大括号不太好理解,用的也不是太多,能看懂即可,工作中用不用在你自己。
10、[ ]
中括号
[ ]
:用于变量的测试。(之后详解讲解)
最好我这里给你们分享一下我所积累和真理的文档和学习资料有需要是领取就可以了
1、学习思路和方法
这个大纲涵盖了目前市面上企业百分之99的技术,这个大纲很详细的写了你该学习什么内容,企业会用到什么内容。总共十个专题足够你学习
2、想学习却无从下手,该如何学习?
这里我准备了对应上面的每个知识点的学习资料、可以自学神器,已经项目练手。
3、软件测试/自动化测试【全家桶装】学习中的工具、安装包、插件....
4、有了安装包和学习资料,没有项目实战怎么办,我这里都已经准备好了往下看
5、如何领取这些配套资料和学习思路图,以及项目实战源码。
这些资料都已经让我准备在一个php网页里面了,可以在里面领取扫码或者进Q群交流都可以暗号和备注是111哦
最后送上一句话:
世界的模样取决于你凝视它的目光,自己的价值取决于你的追求和心态,一切美好的愿望,不在等待中拥有,而是在奋斗中争取。
如果我的博客对你有帮助、如果你喜欢我的文章内容,请 “点赞” “评论” “收藏” 一键三连哦!