bash命令和shell脚本编程中,一些特殊字符具有特殊含义。不了解的人往往认为其晦涩难懂神秘如符文,而掌握其含义则能在使用过程中起到事半功倍的效果。
本文整理bash命令中常用的特殊符号并简要说明其意义,希望对常用bash等shell的人有帮助。文章主要参考tldp的Advanced Bash-Scripting Guide,英文不熟悉的网友可查看linux中国删减版的翻译:Bash 中的特殊字符大全。本文不求全(太多特殊的符号很少用到),更注重常见易用易懂的特殊字符(比如**$_**很常用,但上述两个文档中均没有),让读者看完后能迅速上手。
简单的特殊字符
- !:最直接的功能是逻辑非,最常用的功能是操作历史命令(注意此功能不能用在shell编程中)。例如**!!执行上一条命令,!$指代上一条命令的最后一个单词,!#**指代执行的整条命令,更多可参考:bash快捷键整理;
- ,:最直接的功能是表达式分隔符,较常见的是用在**${}中用于参数替代**,一个逗号表示首字母小写,两个逗号表示全部小写(bash 4.0版本添加的功能):
var=FooBar
echo ${var,} // 结果是fooBar
echo ${var,,} // 结果是foobar
- .:最常见的功能是当前目录,有用的功能是代替
source
命令,其他功能包括正则表达式中的任意字符 - ::空命令(返回0),也常用作PATH等环境变量中的分隔符,神奇的功能是可以作函数名
- ;:命令分隔符
- ~:用户主目录,代替$HOME环境变量
- #:注释符号,也是字符串裁截符
- &:让程序放入后台执行,可单独使用,也常配合
nohup
一起让程序脱离当前终端 - /:文件夹分隔符,单独代表根目录,也是除号
- *:最常用是匹配通配符,也是乘号
- \:转义或换行
- -:常用功能的是命令短选项,例如
ls -ah
;实用的用法是单独使用代表前一个目录,以及取代标准输入输出;也是减号 - +:常用在正则表达式中表示至少匹配一次,也是加号
- |:管道
- ?:匹配一个字符,或正则表达式中的0-1次匹配,也是三元运算符
- ..:上级目录
- <<:here-doc
- --:最常用的是长选项符号,神奇的用法是单独使用时代表后面参数不做解析,也是递减符号
- <<<:here-string,与**<<**的区别是不用手动输入
- &&, ||:逻辑与和逻辑或,常用在测试结构或多条命令有条件执行
- >, <, >>, &<, >&:输入输出重定向
- {} ;:
find
命令中与-exec
一起使用,代表文件的绝对路径。注意反斜杆和分号都不能省略
以**$**开头的特殊字符
**$**符号除引用变量、执行子命令外,还有许多晦涩但又有用的黑魔法。其经常出现在hell脚本、makefile文件中,因此非常有必要掌握。本节特地选出常见的用法。
- $$:当前脚本的进程id
- $!:上一个后台进程的id
- $#:参数个数
- $[0-n]:第0-n个参数,第0个参数即命令本身
- $?:上一条命令的退出码,用来判断命令是否执行成功
- $_:上一条命令的最后一个单词,命令行中与**!$**相同
- $@:全部参数(数组)
- $*:全部参数(字符串)