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个参数即命令本身
  • $?:上一条命令的退出码,用来判断命令是否执行成功
  • $_:上一条命令的最后一个单词,命令行中与!$相同
  • $@:全部参数(数组)
  • $*:全部参数(字符串)

参考

  1. Advanced Bash-Scripting Guide
  2. Bash 中的特殊字符大全
  3. bash快捷键整理