注意,变量赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。
双引号""之间,以及单斜号``之间的变量会被替换,单引号''之间则不会
函数调用不加括号,参数用空格隔开

变量 含义
$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 "父脚本:父脚本执行结束。脚本退出!"