Linux下高效编写Shell――shell特殊字符汇总
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好,往往能给我们起到事半功倍的效果,为此,特地将Shell里面的一些符号说明罗列成对照表的形式,以便快速的查找。看看你知道下表中哦你的哪些Shell符号呢?
Shell符号及各种解释对照表:
注释符号(Hashmark[Comments])
1.在shell文件的行首,作为include标记,#!/bin/bash;
2. 其他地方作为注释使用,在一行中,#后面的内容并不会被执行,除非;
3. 但是用单/双引号包围时,#作为#号字符本身,不具有注释作用。
点号(dot command [period])。
1. 相当于bash内建命令source,如:
#!/bin/bash
. data-
file
#包含data-file;
2. 作为文件名的一部分,在文件名的开头,表示该文件为隐藏文件,ls一般不显示出来(ls -a 可以显示);
3. 作为目录名,一个点代表当前目录,两个点号代表上层目录(当前目录的父目录)。注意,两个以上的点不出现,除非你用引号(单/双)包围作为点号字符本身;
4. 正则表达式中,点号表示任意一个字符。
逗号(comma operator [comma])。
1. 用在连接一连串的数学表达式中,这串数学表达式均被求值,但只有最后一个求值结果被返回。如:
#!/bin/bash
let
t1=((a=5+1, b=7+2))
echo
t1=$t1, a=$a, b=$b
## 这个$t1=$b;
a=
"ATest"
echo
${a,}
echo
${a,,}
## 前面输出aTest,后面输出的是atest。
反斜线,反斜杆(escape [backslash])。
1. 放在特殊符号之前,转义特殊符号的作用,仅表示特殊符号本身,这在字符串中常用;
2. 放在一行指令的最末端,表示紧接着的回车无效(其实也就是转义了Enter),后继新行的输入仍然作为当前指令的一部分。
斜线,斜杆(Filename path separator [forward slash])。
1.作为路径的分隔符,路径中仅有一个斜杆表示根目录,以斜杆开头的路径表示从根目录开始的路径;
2.在作为运算符的时候,表示除法符号。如:
a=4
/2
a=`
dirname
'/tmp/x.log'
`
## 后面dirname返回的结果会赋值给a,
## 注意,此处Mitchell特地使用了反引号和单引号,注意区别。
冒号(null command [colon])。空命令,这个命令什么都不做,但是有返回值,返回值为0(即:true)。这个命令的作用非常奇妙。
1. 可做while死循环的条件;
2. 在if分支中作为占位符(即某一分支什么都不做的时候);
3. 放在必须要有两元操作的地方作为分隔符,如:
: ${username=`
whoami
`}
4. 在参数替换中为字符串变量赋值,在重定向操作(>)中,把一个文件长度截断为0(:>>这样用的时候,目标存在则什么都不做),这个只能在普通文件中使用,不能在管道,符号链接和其他特殊文件中使用;
5. 甚至你可以用来注释(#后的内容不会被检查,但:后的内容会被检查,如果有语句如果出现语法错误,则会报错);
6. 你也可以作为域分隔符,比如环境变量$PATH中,或者passwd中,都有冒号的作为域分隔符的存在;
7. 你也可以将冒号作为函数名,不过这个会将冒号的本来意义转变(如果你不小心作为函数名,你可以使用unset -f :
来取消function的定义)。
感叹号(reverse (or negate) [bang],[exclamation mark])。取反一个测试结果或退出状态。
1. 表示反逻辑,比如后面的!=,这个是表示不等于;
2. 表示取反,如:ls a[!0-9] #表示a后面不是紧接一个数字的文件;
3. 在不同的环境里面,感叹号也可以出现在间接变量引用里面;
4. 在命令行中,可以用于历史命令机制的调用,你可以试试!$,!#,或者!-3看看,不过要注意,这点特性不能在脚本文件里面使用(被禁用)。
星号(wildcard/arithmetic operator[asterisk])。
1. 作为匹配文件名扩展的一个通配符,能自动匹配给定目录下的每一个文件;
2. 正则表达式中可以作为字符限定符,表示其前面的匹配规则匹配任意次;
3. 算术运算中表示乘法。
问号(test operator/wildcard[Question mark])。
1. 表示条件测试;
2. 在双括号内表示C风格的三元操作符((condition?true-result:false-result));
3. 参数替换表达式中用来测试一个变量是否设置了值;
4. 作为通配符,用于匹配文件名扩展特性中,用于匹配单个字符;
5. 正则表达式中,表示匹配其前面规则0次或者1次。
美元符号(Variable substitution[Dollar sign])。前面已经表示过一种意思。
1. 作为变量的前导符,用作变量替换,即引用一个变量的内容,比如:echo $PATH
;
2.在正则表达式中被定义为行末(End of line)。
圆括号(parentheses)。
1, 命令组(Command group)。由一组圆括号括起来的命令是命令组,命令组中的命令实在子shell(subshell)中执行。因为是在子shell内运行,因此在括号外面是没有办法获取括号内变量的值,但反过来,命令组内是可以获取到外面的值,这点有点像局部变量和全局变量的关系,在实作中,如果碰到要cd到子目录操作,并在操作完成后要返回到当前目录的时候,可以考虑使用subshell来处理;
2. 用于数组的初始化。
echo
{a,b,c}-{\ d,
" e"
,
' f'
}
xargs -i
中的话,还可以作为文本的占位符,用以标记输出文本的位置。find
命令中-exec
选项的命令序列,在实际使用的时候,要转义一下以免被shell理解错误。中括号(brackets)。
1. 测试的表示,Shell会测试在[]内的表达式,需要注意的是,[]是Shell内建的测试的一部分,而非使用外部命令/usr/bin/test
的链接;
2. 在数组的上下文中,表示数组元素,方括号内填上数组元素的位置就能获得对应位置的内容,如:
Array[1]=xxx
echo
${Array[1]};
a=3
b=7
echo
$[$a+$b]
echo
$[$a*$b]
##返回是10和21
scriptname >filename
command
&>filename
command
>&2
scriptname >>filename
[i]<>filename
/dev/fd/
下面产生类似/dev/fd/63
,/dev/fd/62
这类临时文件,用来传递数据。Mitchell个人猜测之所以用这种方法来传递,是因为前后两个不属于同一个进程,因此需要用共享文件的方式来传递资料(这么说其实管道也应该有同样的文件?)。网上有人说这个只是共享文件而已,但是经过测试,发现虽然有/dev/fd/63
这样的文件产生,但是这个文件其实是指向pipe:[43434]这样的通道的链接。command [args] <<<["]$word["]
;$word会展开并作为command的stdin。ls | wc l
,使用管道就可以将命令连接在一起。注意:管道是每一个进程的标准输出都会作为下一个命令的标准输入,期间的标准输出不能跨越管道作为后继命令的标准输入,如:
cat filename | ls -al | sort ##想想这个的输出? 同时,管道是以子进程来运行的,所以管道并不能引起变量改变。
## COMMAND -[选项列表]
ls
-al
sort
-dfu $
file
set
-- $variable
if
[ $
file
-ot $file2 ]
then
echo
"$file is older than $file2."
fi
bunzip2 linux-2.6.13.
tar
.bz2 |
tar
xvf -
##将前面解压的数据作为tar的标准输入
##(这里使用一个-表示)
var=
"-n"
echo
$var
## 试试看有什么输出?
还有,这种表示方法不是Bash内建的,要达到此点的这种效果,需要看你使用的软件是否支持这种操作;
3. 表示先前的工作目录(previous working directory),因此,如果你cd到其他目录下要放回前一个路径的时候,可以使用cd -来达到目的,其实,这里的[-]使用的是环境变量的$OLDPWD,注意:这里的[-]和前一点是不同的;
4. 减号或者负号,用在算术操作中。
等号(Equals)。
1. 赋值操作,给变量赋值,么有空格在等号两侧;
2. 在比较测试中作为比较符出现,这里要注意,如果在中括号中作为比较出现,需要有空格符在等号左右两侧。
加号(Plus)。
1. 算术操作符,表示加法;
2. 在正则表达式中,表示的是其前的这个匹配规则匹配最少一次;
3.在命令或过滤器中作为选项标记,在某些命令或者内置命令中使用+来启用某些选项,使用-来禁止;
4. 在参数替换(parameter substitution)中,+前缀表示替代值(当变量为空的时候,使用+后面的值)
百分号(modulo[percent sign])。
1.在算术运算中,这个是求模操作符,即两个数进行除法运算后的余数;
2. 在参数替换(parameter substitution)中,可以作为模式匹配。例子:
p=b*9
var=
"abcd12345abc479"
echo
${var%p}, ${var%%p}
##从右边开始查找(想想从左是那个符号?)
##任何在b和9之间的内容(含)
##第一个是找到最短的符合匹配项
##后一个是找最大符合的匹配项(贪婪匹配?)
var="this is a test message." [[ "$var" =~ tf*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found." ##你可以修改中间的正则表达式匹配项,正则表达式可以但不一定需要使用双引号括起来。
脱字符(caret)。
1. 在正则表达式中,作为一行的行首(beginning-of-line)位置标志符;
2. 在参数替换(Parameter substitution)中,这个用法有两种,一个脱字符(${var^}
),或两个(${var^^}
),分别表示第一个字母大写,全部大写的意思(Bash version >=4)。
怎样,你有多少是了解的呢?Mitchell在开始的Shell脚本时候,发现在这里面有好多都是不认识呢。
说明:
因为涉及到翻译,文中内容不一定完全翻译准确,如果你发现有错误的地方,还请包涵指正。
参考:
参考内容为本篇成文之际给予Mitchell帮助较大的文章,在整个过程中还有很多网站信息给我提供了帮助,在此对他们的作者的无私贡献表示感谢!
RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成