bash中的特殊符号
'' 单引号,在单引号中所有的特殊符号都没有了特殊的意义。
"" 双引号,在双引号中特殊符号都没有特殊含义但是 $ ` 和 \ 例外,分别拥有
调度变量 引用命令 和 转义符 的特殊含义
`` 反引号,反引号括起来的内容是系统命令,在bash中会优先执行,和 $() 的作用一样,不过推荐使用$(),
反引号容易看错
$() 和反引号的作用一样,引用系统命令
() 用于一串命令执行时,()中的命令会在子shell中执行
{} 用于一串命令执行时,{}中的命令会在当前shell中执行,也可以用于变量变形与替换
[] 用于变量测试
# 在shell脚本中,以#开头的行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出$符号,不当做变量引用
单引号和双引号
单引号和双引号用于变量出现空格时,比如,name=xiao ming这样执行就会出现问题,而必须用引号括起来
比如name="xiao ming"。不过引号有单引号和双引号之分,二者的主要区别在于,被单引号括起来的字符都是普通字符。
就算特殊字符也不再有特殊含义,而被双引号括起来的字符中,"$"和"\"和反引号是拥有特殊含义的,"$"代表引用变量的值,而反引号
代表引用命令。
如果需要在双引号中输出$和反引号需要在符号前加上转义符\
例子就略啦
反引号
如果需要调用命令的输出,或把命令的输出赋予变量,则命令必须使用反引号包含,这条命令才会执行。反引号的作用和$(命令)是一样的
但是反引号容易和单引号搞混。建议使用$(命令)
小括号和大括号
父shell子shell
[root@andy ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─agetty
├─atd
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─httpd───5*[httpd]
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rpcbind
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
├─vmtoolsd───{vmtoolsd}
├─vsftpd
├─xinetd
├─zabbix_agentd───5*[zabbix_agentd]
└─zabbix_server
[root@andy ~]#
可以看到pstree在父shell中执行的
[root@andy ~]# bash
[root@andy ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
│ └─2*[{NetworkManager}]
├─agetty
├─atd
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─httpd───5*[httpd]
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rpcbind
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
├─vmtoolsd───{vmtoolsd}
├─vsftpd
├─xinetd
├─zabbix_agentd───5*[zabbix_agentd]
└─zabbix_server
[root@andy ~]#
执行一次bash后则pstree在子shell中执行的
关于父shell和子shell,可以想象成在Windows中开启了一个cmd字符操作终端,Windows本身就是父shell,cmd就是子shell
如果用于执行一串命令,小括号和大括号的区别
()执行一串命令时,需要重新开启一个子shell来执行
{}执行一串命令时,在当前shell中执行
()和{}都是把一串命令放在括号里面,并且命令之间用";"隔开
()最后一条命令可以不用分号
{}最后一条命令也要用分号
{}的第一条命令和左括号之间必须有一个空格
()里的各命令不必和括号有空格
在执行一串命令时,如果使用的小括号,则这串命令所做的修改只在子shell中生效
一旦命令结束,回到父shell中,这个修改就会丢失,而如果,使用的时大括号,则此串命令直接在父shell
中执行,命令结束后,修改依然生效