注意,变量赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。
双引号""之间,以及单斜号``之间的变量会被替换,单引号''之间则不会
函数调用不加括号,参数用空格隔开
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名。 |
$n(n≥1) | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,我们将在《Shell $*和$@的区别》一节中详细讲解。 |
$? | 上个命令的退出状态,或函数的返回值,我们将在《Shell $?》一节中详细讲解。 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
while循环
i = 0 while ((i<100)) do ((i++)) echo "$i" done
shell数组访问
#!/bin/bash str="a b --n d" array=($str)#字符分割,默认分割符是' ' length=${#array[@]} echo $length for ((i=0; i<$length; i++)) do echo ${array[$i]} done
一定时间内监控状态
remain_time=5 while (( 1 == 1 )) do a=`top -n 1 | sed -n '3,4p'` echo "$a">>cpu_mem.txt sleep 1 ((remain_time=$remain_time-1)) if (($remain_time == 0)) then break fi done
shell函数中参数(从$1开始)
funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73
if语句
if (( 1 == 1 )) then echo 'if' elif (( 2 == 2 )) then echo 'elif' else echo 'else' fi
生成1~100的序列
seq 1 100
抑制命令输出
#后台进程 # &1 表示文件描述符。不加&的话会,输出到一个名字为1的文件 command > /dev/null 2>&1 &
删除所有子shell
kill `ps |grep bash|grep -v $$|awk '{print $1}'` >/dev/null 2>&1
小数计算
cpu_idle="99.9" cpu_use=`echo "scale=2;100.0 - $cpu_idle" | bc` echo $cpu_use
持续x秒,每隔1秒查询一次cpu和mem(如果有变化就写入日志)
top -b -d 1 -n $x|grep -E "%Cpu|KiB Mem">> $output_file
getopts用法
字符串截取
异步编程
#!/bin/bash # # 异步执行(wait)使用样例-父脚本 # echo "父脚本:启动子脚本.." ./async-child & # 通过将shell参数 $! 赋给pid变量,以记录子进程的进程ID pid=$! echo "父脚本:子脚本(PID=${pid})已启动" echo "父脚本:继续执行中.." sleep 2 echo "父脚本:暂停执行,等待子脚本执行完毕.." wait ${pid} echo "父脚本:子脚本已结束,父脚本继续.." echo "父脚本:父脚本执行结束。脚本退出!"