shell运算符和引用
这里仅列出一部分符号
| 类型 | 符号 | 作用 | 用法 |
|---|---|---|---|
| 引号 | 双引号 "" | 部分引用,仅$`\保留作用 | foo="${a}123" |
| 引号 | 单引号 '' | 完全引用,原样输出 | foo='foo$a' |
| 引号 | 反引号 `` | 执行命令 | foo=ls -a |
可以发现shell中引号的用法与其它编程语言有着很大的不同,双引号与单引号存在语法上的区别,而非大多数常见的编程语言可以混用表示字符串。
管道
管道符 | 是shell中常用的一个符号,将前一个命令的结果传递至后面的命令,给予了shell编程足够的灵活性。但值得注意的是,管道右侧的命令必须能接受标准输入,比如grep命令,ls、mv等不能直接使用,但是可以通过xargs处理。xargs顾名思义,arguments,将标准输出解析为参数。
如:
#!/bin/bash 指定解释器路径
cat platform.access.log | grep ERROR
netstat -an | grep ESTABLISHED | wc -l # 显示有多少已建立的连接
find . -maxdepth 1 -name "*.sh" | xargs ls -l # 递归深度为1 列出以.sh为后缀的文件
重定向
标准输入、标准输出、标准错误输出
2>:错误输出写入文件 &>:标准输出与标准错误输输出到同一个文件。
判断命令
shell中提供了test、[、[[三种判断符号,可用于:
- 整数测试
- 字符串测试
- 文件测试
语法:
- test condition
- [ condition ]
- [[ condition ]]
注意:中括号前后要有空格符
可以发现,这又是shell中非常别扭的一点,即空格是语法的一部分。在赋值符号前后不能有空格,在判断的中括号前后又需要有空格,可以说是让人非常迷惑了。现代编程语言基本舍弃了这一点,大多数时候空格都是可选的。
分支语句
可分为if语法与case语法。下面是if语法的格式:
if condition ; then
program
elif condition ; then
program
else
program
fi
倒是与现代编程语言的if分支没有5太大的不同,除了需要用fi结束分支块。
函数
- funcName(){ echo "abc"; }
- function funcName() { echo "abc";}
注意return仅仅表示函数执行状态,不代表结果。返回结果一般通过echo printf等,在函数外使用$()取得。
执行过程
- 字符解析
- 识别换行符、分号(;)做行的分割
- 识别命令连接符做命令的分割
- 识别空格、tab符,做命令和参数的分割。
- shell展开
- 重定向
- 执行
- 收集状态并返回
总结
shell的语法多且繁杂,又与现代编程语言有着一定的出入,但在系统编程方面shell又有着一定的优势。现在我一般的做法就是简单任务、贴近系统的任务通过shell解决,其它情况通过通用编程语言调用shell子进程解决。不过现在有chat了,没事问问他可能更方便。