从开始接触linux,或多或少会使用到shell,这篇文章用来整理下用过的shell语法,和比较常见的套路。
常用语法
test
用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
1
2
3if test -e startup.sh ;then
等价于
if [[ -e startup.sh ]];then注意:可以使用[[]]就不要使用[],[[]]兼容在命令中使用&&、||、<和> 等操作符
数组
定义数组
1
modules=(bond-web bifrost model-engine gaeaproxy)
获取数组所有元素,@可被*替换
1
{modules[@]}
遍历数组
1
2
3for module in "${modules[@]}"; do
echo $module
done读取数组指定元素
1
{modules[index]}
数组长度
1
@可被*替换|${#my_array[@]}
变量
全局变量
1
2全局变量的作用域是当前的进程,而不是前端的shell脚本文件
a=1局部变量
1
local a=1
环境变量
1
2export a=1
作用域为当前shell进程和其子进程特殊变量
示例 | 变量含义 | |
---|---|---|
$@ | 所有入参,可以通过set设置 set 11 22 33 44 | |
$# | 参数个数 | |
$? | 上个命令的退出状态 | 函数的返回值 |
$$ | 当前shell进程的ID | |
$! | Shell最后运行的后台Process的PID | |
total=$#|action=${!total} | 获取最后一个参数,也可通过eval action=\$$# |
|` `|指令定义,相较于’’,会预执行,在指令嵌套时经常用到|
|echo $aa | echo ${aa}|读取变量|
|$((2+3)) |进行整数运算|
eval
- 该命令对变量进行两次扫描
1
2
3
4
5a=`echo hello`
b='echo $a'
等价于
a='echo hello'
b=eval 'echo $a'
引号
示例 | 含义 |
---|---|
‘ ‘ 单引号 | 剥夺所有字符的特殊含义,如 n=3;echo ‘$n’ -> $n |
“ “ 双引号 | 引号内可参数替换,$和反引号
|
反引号 |
用命令替换,即先执行 内命令,将输出结果暂存,在适当的地方输出 |
重定向
1 | ehco 'haha' > /tmp/tmp.log 2>&1 |
常见的服务启动脚本
1 | !/bin/bash |
- 注意服务启动间隔如果不加
sleep 0.01
,可能会导致获取服务状态异常,即杀掉服务需要一定的信号处理时间
开机启动
- 将启动指令配置进/etc/rc.d/rc.local
- 注意,任何一个脚本执行失败,即exit非0,将导致该shell session内的所有启动服务失败,而如何配置在rc.local中的指令exit非0,将导致整个系统初始化失败