SHELL体系知识I

        SHELL作为最常用软件技能之一,能自动化、批量的完成很多相关简单的功能。学习SHELL的重要性不言而喻,那么如何学习SHELL自然成为一个重要的问题?
        个人认为学习SHELL需要分四部分进行:
        1.学习SHELL入门教程(如:http://www.hechaku.com/shell/)
        2.总结SHELL的语法知识
        3.总结SHELL的常用指令
        4.归档SHELL的常用用法
        第一步由于网上的资料又多又好,在此我就不在赘述。我从第二步开始向大家展示我总结的SHELL理论图:SHELL体系知识I
1.概念:C语言编写,需要解释器执行的指令集合。
        1.1.C语言编写:继承了C语言的很多语法结构。
        1.2.解释器执行:脚本语言。
        1.3.指令:编译好能执行特定功能的执行程序。
2.变量
        2.1.概念:通过变量名访问、内容可变的抽象概念。
        2.2.分类
                2.2.1.数值、字符串
                        2.2.1.1.定义:variable_name=variable_value
                        2.2.1.2.使用:${variable_name}
                2.2.2.数组
                        2.2.2.1.定义:array_name=( value…valuen)/array_name[index]=value
                        2.2.2.2.使用:${array_name[index]}
                2.2.3.保留变量
                        2.2.3.1.参数类型
                                2.2.3.1.1.${#}:传入参数的个数。
                                2.2.3.1.2.${n}:引用传入的第n个参数。
                                2.2.3.1.3.${}:将n个参数做为一个参数传入。
                                2.2.3.1.4.${@}:将n个参数做为n个参数传入。
                        2.2.3.2.环境类型
                                2.2.3.2.1.${0}:当前使用的SHELL。
                                2.2.3.2.2.${$}:当前SHELL的进程号。
                                2.2.3.2.3.${?}:上一条指令执行状态。
        2.3.只读设置:readonly variable_name
3.运算符
        3.1.算术运算符
        3.1.1.符号:+、-、
、/、%
        3.1.2.示例
                3.1.2.1.整型运算:variable_name=expr ${num} / 10
                3.1.2.2.浮点型运算:variable_name=$( echo “scale=10; ${num} / 76”|bc)
        3.2.赋值运算符:=
        3.3.逻辑判断运算符
                3.3.1.符号
                        3.3.1.1.判断符号:==、!=、>、<
                        3.3.1.2.特点
                                3.3.1.2.1.>、<符号使用时需要增加转义字符。
                                3.3.1.2.2.变量当成字符串比较,不适合数值比较。
                                3.3.1.2.3.没有>=、<=符号使用。
                3.3.2.保留字
                        3.3.2.1.保留字:-eq、-ne、-ge、gt、le、lt
                        3.3.2.2.特点
                                3.3.2.2.1.适用于整型数据比较,浮点型数据比较请使用bc指令。
        3.4.布尔运算符
                3.4.1.与
                        3.4.1.1.符号:-a、&&
                                3.4.1.2.示例
                                        3.4.1.2.1.-a:[ ${DRINK} == ‘appe’ -a ${DRINK} == ‘all’ ]
                                3.4.1.2.2.&&:[ ${DRINK} == “tee” ] && [ ${DRINK} == “cofee” ]
                3.4.2.或
                        3.4.2.1.符号:-o、||
                        3.4.2.2.示例
                                3.4.2.2.1.-o:[ ${DRINK} == ‘appe’ -o ${DRINK} == “all” ]
                                3.4.2.2.2.||:[ ${DRINK} == tee ] || [ ${DRINK} == cofee ]
                3.4.3.非
                        3.4.3.1.符号:!
                        3.4.3.2.示例:[ ! ${str1} < ${str2} ]
        3.5.字符串判断:-z、-n
        3.6.文件测试运算符:-d、-f、-r、-w、-x

4.分支结构
        4.1.基础结构
                4.1.1.if
                        4.1.1.1.示例
if [ ${DRINK} == “coffee” ]
then
        FLAG=1
elif [ ${DRINK} == “tea”
then
        FLAG=2
else
        FLAG=3
fi
                4.1.2.case
                        4.1.2.1.示例
case $DRINK} in
        tea|coffee|water)
                echo “Go to canteen”
                ;;
        all|appe)
                echo “Available at home”
                ;;
        *)
                echo “Error:Invalid selection”
                ;;
esac
                4.1.3.while
                        4.1.3.1.示例
while [ ${num} -ge 122 ]
do
        echo " The value of variable is ${num}"
        break
done
                4.1.4.for
                        4.1.4.1.示例
for LINE_STR in ${array[@]}
do
        echo ${LINE_STR}
done
                4.1.5.until
                        4.1.5.1.示例
until [ ${num} -gt 10 ]
do
        echo “${num}”
done
                4.1.6.select
                        4.1.6.1.示例
select DRINK in $( echo “tea cofee water juice”)
do
        echo “${DRINK} is select value”
        echo “The number of cycle is ${num}”
        num=expr ${num} + 1
done
        4.2.控制字符:continue、break

5.函数
        5.1.概念:反复执行的代码块。
        5.2.定义
                function_name()
                { list of commands}
        5.3.使用
                function_name para_list
        5.4.外调相互调用:. fullpath_name/source fullpath_name
        5.5.内部特殊用法
                5.5.1.变量替换
                        5.5.1.1.${var:-word}:变量为空或未设置,则返回word且不改变var值。
                        5.5.1.2.${var:+word}:变量设置,则返回word且不改变var值。
                        5.5.1.3.${var:?msg}:变量为空或未设置,则将消息送到标准输出,且终止程序。
                        5.5.1.4.${var:=word}:变量为空或未设置,则返回word且改变var值。
                5.5.2.命命替换
                        5.5.2.1.command
                        5.5.2.2.$(command)
                5.5.3.重定向
                        5.5.3.1.>:以新文件形式重定向标准输出。
                        5.5.3.2.>>:以追加形式重定向标准输出。
                        5.5.3.3.<:重定向标准输入。
                        5.5.3.4.<<:用于输入重定向一个交互式的shell脚本或程序。

6.shell执行
        6.1.子shell执行
                6.1.1…/shell_name.sh:需要执行权限。
                6.1.2.sh shell_name.sh:不需求执行权限。
        6.2.当前shell执行
                6.2.1.source shell_name.sh:父子shell能共享相关资源。
                6.2.2… shell_name.sh:同上
这个总结图只是一个参考,画得好不好,对不对都不重要。但有三点是重要的:
       1.学习之后要自己画一张自己的图。
       2.理解性的记忆这张图,重温这张图。
       3.使用SHELL知识时回顾这张图,系统的思考、应用这张图。