Bootstrap

Shell 学习笔记

目录

脚本书写规范及注意点

内建命令

变量

函数

定义及使用

参数处理

条件判断

if

case

循环判断

while

for

echo

Shell 中获取命令结果问题

调试


脚本书写规范及注意点

  • 在vscode中写脚本,加上必要的双引号有助于理解和分析代码,梳理明白逻辑;

  • 添加执行权限,添加一次后,后续就不用修改了;

  • 最后验证功能;

内建命令

凡是通过which命令查不到程序文件所在位置的命令

帮助手册:man bash-builtins

变量

环境变量

本地变量

脚本中定义的变量是全局变量

局部变量:local 变量名 函数内部使用

函数

定义及使用

[function] 函数名 ()
{
    command
}
返回值和c中一样,正确返回0,错误返回非0

参数处理

$#:参数的个数,不包括命令本身

$0:进程名,相当于C中的argv[0]

$1:第一个参数

$@:参数列表

$*:参数列表

$$:进程id

$?:上一行命令的退出状态,0表示成功,非0表示失败

条件判断

if

普通逻辑判断

VAR=2

if [ $VAR -gt 2 ]; then

        echo "gt"

fi

字符串比较:

if [ -n "${var1}" ]; then
    echo "ffff"
fi
​
if [ -z "${var1}" ]; then
    echo "gggg"
fi
​
进行字符串比较时,使用[[ ]]非常方便,不用考虑转义的情况,如:
if [ "fang" \< "gong" ]; then
    echo "fang < gong"
fi
​
if [[ "fang" < "gong" ]]; then
    echo "fang < gong"
fi

文件判断:

-d 文件 判断该文件是否存在,并且是否为目录
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件

复杂逻辑判断

-a    与
-o   或
 !   非

case

case 值 in
    模式1 | other1)
        command
        ;;
    模式2 | other2)
        command
        ;;
    *)
        command
        ;;
esac

循环判断

while

i=0
while [ $i -lt 10 ]; do
    command
done

for

显示家目录下所有以.bash开头的文件
for FILE in $HOME/.bash*
do
   echo $FILE
done

echo

echo -n 换行 echo -e 处理转义字符

Shell 中获取命令结果问题

在shell 中获取命令的执行结果:

ETHTOOL="/root/bin/ethtool"
INTERFACE_NAME="eth0"
result=`${ETHTOOL} ${INTERFACE_NAME}`

而如果仅仅执行命令,就不用倒引号包含了:

ETHTOOL="/root/bin/ethtool"
INTERFACE_NAME="eth0"
MATCH_PATTERN="Speed: 10Mb/s"
${ETHTOOL} ${INTERFACE_NAME} | grep "${MATCH_PATTERN}" 1>/dev/null 2>/dev/null

调试

-n 检查语法错误

;