特殊字符在bash shell中的应用非常的广泛,一直没有系统的整理过相关的知识,最近系统学习了一下,还是自己英文阅读能力不够,所以这边的学习材料不是man bash,是《Advanced-Bash-Scripting-Guide》的中文译本,羡慕英文学的很不错的,在学习的时候还是阅读外文原文不会出现理解偏差,不过我是实用主义者,能用就行,不纠结,需要优化的时候再深入吧,下面开始吧。
【#】
注释符号,除开头的#!符号外,其余写在开头都是注释,#还能写在执行语句后面进行注释,写在语句后面的时候需要空格隔开,这里需要注意的是bash仅支持单行注释,没有符号可以结束注释,所以在写新的执行语句的时候,必须另起一行,在语句中写#的时候,如果被包含在'' ""引用符和\转义符中的时候认为就是#字符,没有注释的含义,还有一些其他的用法,在变量扩展中的替换和进制转换等。
### Option: SourceIP # Source IP address for outgoing connections. # # Mandatory: no # Default: SourceIP=192.168.100.100 ##zabbix-server的ip grep -E "^#" /etc/zabbix/zabbix_server.conf #筛选出zabbix-server配置文件中#开头的行 sed -e '/^#/d' -e '/^$/d' /etc/zabbix/zabbix_server.conf ##删除配置文件中#开头的行和空行 echo ${PATH} > /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin echo ${PATH#*:} > /usr/local/bin:/usr/sbin:/usr/bin:/root/bin echo ${PATH##*:} > /root/bin echo $((2#101011)) > 43
【;】
分号是命令分隔符,允许在同一行内放置两条或者更多的命令,我就喜欢直接在命令行中输入一些循环判断语句,减少脚本文件的时候
for i in *;do echo $i;done > anaconda-ks.cfg > zabbix-server A=a;B=b;C=c;echo $A $B $C | while read varA varB varC;do echo $varC $varB $varA;done > c b a A=1;B=2;if [ $A -gt $B ];then echo $A是较大值;else echo $B是较大值;fi > 2是较大值
【;;】【;;&】【;&】
case条件语句终止符号,;;&和;&是bash4+版本中的终止符
A=1 case $A in "1") echo $A ;; "2") echo $A ;; esac
【.】
句点符号.等价于source命令
source /etc/profile.d/test.sh . /etc/profile.d/test.sh ##二者等价
.号开头的文件在linux中是隐藏文件,ls命令不显示,需要加-a参数
ls -a > . .. 2 anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc .mysql_history .tcshrc .viminfo ## .代表当前目录,..代表上级目录
正则表示中.匹配任意单个字符
grep "^S.urce.P" /etc/zabbix/zabbix_server.conf > SourceIP=192.168.100.100
【"】和【'】
使用"和'的时候,需要了解一下特殊字符的概念,特殊字符是指字符不仅仅有表面字符的意义,还具有其他特殊意义的字符,比如*在正则中匹配任意数量的任意字符。
"和'具有引用的功能,可以保护shell或者shell脚本中被重新解释过或者带扩展功能的特殊字符,双引号部分引用(保留大部分特殊字符,例如不保留$),单引号全部引用(保留全部特殊字符)。
a=xyz;echo "$a" '$a' > xyz $a
【,】
逗号运算符,将算术表达式串联在一起,表达式会被依次执行,但是只返回最后一个表达式的结果,还有就是可以在大括号中配合扩展。
ls {/usr,}/bin/* ##显示/usr/bin和/bin目录中所有的文件
【,,】【,】
在参数替换中进行小写字母转换。
【\】
转义符
\n ##换行 \r ##回车 \t ##水平制表符 \v ##垂直制表符 \b ##退格 \a ##警报、响铃或者闪烁 \0xx ##ASCII码的八进制形式
我们都知道bash脚本建议单行命令不要超过多少字符,建议在换行的时候用\来连接,其实这是转义的一种形式,echo打印长语句的时候也可以这么操作。其他的转移在遇到echo的时候,需要echo -e或者echo $'\n'这两种形式。
【/】
文件路径分隔符,算术运算中的除法运算符。
【``】
命令替换符号,`command`和$(command)的效果相当,可以将命令输出结果赋值给一个变量。
【:】
:;echo $? ## 它本身也是Bash的内建命令之一,返回值是true while :;do echo yes;done ##无限循环 if condition;then :;else take-else-action;fi ##在控制语句中,和控制语句continue具有相同的效果 : ${username=`whoami`} # ${username=`whoami`} ## 没有:就会报错,除非usename是系统命令或者内建命令 : ${1?"Usage: $0 ARGUMENT"} ##用于判断是否有位置参数1,没有的话报错并提示信息 : > data.xxx ##会清空data.xxx文件 /usr/local/bin:/bin:/usr/bin ##域分隔符
:还可以作为函数名,但是不建议这么做。
【!】
取反,主要用于bash中test各类参数的取反,=等于和!=不等于。
【*】
通配符扩展文件名,正则中的任意多个字符,包括0个字符和刚刚的.不一样。
算术计算中的乘法。
【?】
通配符,单字符扩展文件名,扩展正则中的单字符。
测试变量是否被赋值,并退出反馈说明。
: ${1?please check the parameters} -bash: 1: please check the parameters
【$】
变量取值,行尾结束符,在正则中$用于匹配行尾,文件的每行结尾都隐藏了$字符,cat –A可以看到。
【${}】
同上。
【$* $@】
位置参数列表。
vim position.sh /bin/bash echo $* ./position 1 2 3 > 1 2 3
【$?】
返回命令和脚本的执行状态,0是正常执行,1是异常执行。
【$$】
返回脚本的运行PID。
【()】
命令组,数组初始化赋值。在用用于一个命令组的时候,会开启一个subshell,这个子shell中设置的变量在括号中命令组执行结束后会失效,所以在subshell中慎用变量。
arrayA=(1 2 3);arrayB+=(1) (a=1);echo $a > ##这里echo并没有输出任何的结果 (a=1;echo $a) > 1 ##父shell无法获取subshell的变量值
【[]】
和test功能一直,测试比较,在[]中填入测试表达式。数组下标。正则中的字符集或者范围。进行算术运算。
[ -z $var ] && echo “var is empty” ##判断var变量是否为空 ls [a-z]* [0-9]* ##列出以小写字母和大写字母开头的文件
【[[]]】
和test功能一致,测试比较,[[]]包含更高级的字符功能。
【{}】
扩展结构,函数符号,文本占位符。
cat {file1,file2,file3} > combined_file ##拼装大括号中的三个文件 cp file22.{txt,backup} ##复制 txt文件到backup文件 echo {file1,file2}\ :{\ A," B",' C'} > file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C echo {a..c} > a b c find / -name *.log | xargs -i grep "pattern" {} ##文本占位符,这里{}代指前面的log文件
【$[]】
整数扩展符,可以用于整数计算
【(())】
整数扩展符,可以用于整数计算
【> >& >> < <>】
重定向符号,> <还可以用于ASCII码的比较
command &>filename ##将命令的stdout和stderr重定向到文件
【|】
管道pipe,上一个命令的输出作为下一个命令的输入或者直接输出到shell中,管道是一种可以将一系列命令连接在一起的绝妙方式。
grep "pattern" xx.log | sort |uniq | wc -l
【>|】
强制重定向,shell提供了一个noclobber的选项,防止不经意的重写已存在文件,但是>|可以无视这个选项,即使在noclobber被设置的情况下也会重写文件。
【||】
逻辑运算符or,也可以用于判断command的执行状态
find / -name xx.log && echo exist || echo not exist
【&】
后台运行操作符,如果命令后带&,那么此命令将转至后台运行
sleep 100 &;jobs;kill %1
【&&】
逻辑运算符and,也可以用于判断command的执行状态
【-】【--】
选项前缀,一个-一般是短选项,两个--一般是长选项,-变量扩展赋值符号
-代表先前的工作目录,cd –可以回溯到上一次打开的目录
【=】
算术运算的等号,变量赋值符号,变量扩展赋值符号(变量扩展章节中有介绍)
【+】
算术运算符,变量扩展赋值符号
【%】
取余
【~】【~+】【~-】
分别代表当$HOME,cd ~回到home目录,~=当前工作目录$PWD,~-和-一样$OLDPWD
【=~】
正则表达式*匹配
【^】【^^】
^行起始符号,两者都可以在参数替换中转换大写字符。