在我接触过的编程语言里面,最奇葩的两个就属 JavaScript 和 Shell 了。因为它们有着太多的语法糖跟特殊字符,总是能够让你措手不及,并且编程习惯也跟Java 和 Python 等语言大相径庭。总之,千万不要因为它们是脚本语言就轻视它们,否则你就会被打得晕头转向。
这两个奇葩之间比起来呢,Shell 的奇葩之处在于特殊符号多,骚操作也多。比如你以为 . 这是个点,其实它代表的意思远不止一个点那么简单 。
下面的内容是我根据网上资料及平时使用经验整理的一份Shell 中的特殊字符。如果大家觉得有用的话就点赞收藏吧。
; 单分号,一般作为命令分隔符。可以将两个命令放在同一行。如: echo hello; echo there,但真正写脚本的时候尽量不要这样写。
;; 双分号,用在 case条件语句的结束符。如:
case "$variable" in abc) echo "/$variable = abc" ;; xyz) echo "/$variable = xyz" ;;esac
% 百分号,用于表示取余操作,也用于正则表达式。
~ 波浪线,表示家目录,等价于$HOME。如 cd ~
~+ 表示当前工作目录,等价于$PWD。
~- 表示上一个工作目录,等价于 ..。
| 管道标识符,将上一个命令的输出作为下一个命令的输入,经常用到,没什么好说的。
>| 强制重定向。强制重写已经存在的文件。
|| 表示逻辑或操作。
& 让命令在后台运行,例如 command & 一般用于启动后台进程服务。
&& 表示逻辑与操作。
* 星号,主要用于通配符匹配,当然也用于乘法表达式。
/ 主要用于转义特殊字符,比如想转义双引号,可以这样 echo /" 输出 “。
/ 文件路径分隔符,比如 /opt/app/projects/ 。当然也用作除法表达式。
. 点号,这个符号作用比较多。 首先可以等价于 source 命令。也可以作为文件名字,在文件名开头,表示该文件是个隐藏文件。 还可以表示当前目录, 比如拷贝某个文件到当前目录 cp /opt/app/a.md . 。如果是两个连续的点则表示上一级目录,比如 cd ..。
最后,点号也是正则表达式的元字符。
" 双引号,双引号里面的变量一般会被解析成赋值的内容。比如
name=frank echo "hello $name" # hello frank
' 单引号,单引号里面的变量一般不会被解析,比如
name=frank echo 'hello $name' #hello $name
' 反引号(ESC键下面那个),要跟单引号区分开。反引号里面的内容会被当作指令执行,并将执行的结果赋值给变量。比如:
file=`ls ~`echo $file #家目录下所有文件。
! 感叹号,一般用于取反。比如 != 表示不等。骚操作在终端中执行,可以表示历史指令比如 !-3,将会输出你刚刚输入的指令。但在脚本中不支持该种写法。
** 双星号,算术运算中表示求幂运算。比如
let "a=3**2"echo $a #9
? 问号,表示条件测试;也用作三元运算符。也是正则表达式元字符。
$ 美元符,放到变量前面,即引用一个变量的内容,比如:echo $PATH;当然也是正则表达式的元字符。
${} 参数替换。用于在字符串中表示变量值。比如
name=frankecho "hello ${name}" #hello frank
$*,$@ 这两个特殊字符都用于获取传递给脚本的所有参数。当他们被双引号包围时,"$*"会将所有的参数从整体上看做一份数据。而"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
新闻热点
疑难解答