shell脚本基础

一、基础概念点

    1.语言特点

脚本语言:
    不需编译,由解释器解释执行;
    弱类型:变量类型
    变量通常不需要事先声明

编译语言 (gcc: GNU C Complier)
    事先编译(源程序-->目标代码-->链接-->执行);运行时不再依赖于编译器;
    强类型
    变量需要事先声明

脚本语言:bash, python, perl, ruby

bash:面向过程

    2.变量类型:
        本地变量
            set VAR_NAME=value
            unset VAR_NAME
            ${VAR_NAME}
            作用范围:当前shell进程;
        局部变量
            local VAR_NAME=value
            unset VAR_NAME
            ${VAR_NAME}
            作用范围:在当前shell进程的局部范围内有效;
        环境变量
            export VAR_NAME=value
            unset VAR_NAME
            ${VAR_NAME}
            使用范围:当前shell及其子shell;
        位置变量:$1, $2, ...   
        特殊变量:$$, $?, $#, $@, ...

        $0 取脚本本身文件名 一般用basename $0 取基名

    3.bash脚本路径:
        # bash /path/to/script_file.sh

       独立执行:
            1、要有执行权限;
            2、定义好shebang, 即脚本的第一行:#!/path/to/explainer,例如:/bin/bash, /usr/bin/python

            /root/a.sh

            # /root/a.sh: 所有命令都会到PATH环境变量所定义的路径下去查找;
            # export PATH=$PATH:/root

   4.bash的配置文件
        profile类:/etc/profile, /etc/profile.d/*.sh, ~/.bash_profile
            声明环境变量
            执行程序或脚本
        bashrc类:/etc/bashrc, ~/.bashrc
            定义本地变量
            定义命令别名

   5.bash脚本流程控制  

  顺序执行:默认法则,逐条执行各语句
    选择执行:条件判断,只有部分是符合条件,只执行符合条件的部分;
        布尔测试:真,假;
            0:真
            1-255:假
    循环执行:将同一段代码反复执行n次;循环必须要有退出条件,否则,就成为了死循环;

控制语句:
    bash循环控制语句:
        for
        while
        until

    6.shell脚本中进行算术运算:
      shell不支持浮点数;计算结果中的浮点数会被圆整为整数;1.23, 1; 1.99=1;

    +, -, *, /,

    算术运算的实现方式:假设A=5,B=9
        $[expression]:例如$[$A+$B]
        $((expression)): 例如$(($A+$B))
        let expression:  例如 let E=$A+$B
        expr expression: F=`expr $A + $B` #加号两侧必须有空格不同于以上方式

二、bash的for循环:

1.基本形式

事先提供一个元素列表,而后,使用变量去遍历此元元素列表;每访问一个元素,就执行一次循环体;直到元素访问完毕;

    用法格式:
        for VAR_NAME in 列表;do
            语句1;
            语句2;
            ...
        done

2. 列表的生成:
    1、逐个给出,如:/etc/inittab /etc/fstab;
    2、使用通配符实现文件通配,例如for File in /var/*;
    3、使用命令生成列表:见下面的例子

#!/bin/bash

for File in `ls /var`; do
  file /var/$File
done

    4、生成数字序列:
        {}:{起始数字..结束数据},例如{1..100}表示从1到100之间的所有正整数;
        `seq [起始数字] [步长] 结束数字`: 步长默认1 可省略

3.  例,使用for循环统计/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#开头的行的行数和空白行数;
#!/bin/bash

for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do
  echo "$File:"
  echo -e "\t#lines: `grep "^#" $File | wc -l`"    #-e选项允许转义输出,此种输出方式使脚本更易读。
  echo -e "\tspace lines: `grep "^$" $File | wc -l`"
done

4. 例,写一个脚本使用for循环取出每个用户用户名和Shell;

#!/bin/bash
LINES=`wc -l /etc/passwd | cut -d' ' -f1`   #此处-d后不可用[:space:]

for I in `seq 1 $LINES`; do
  head -$I /etc/passwd | tail -1 | cut -d: -f1,7
done

三、bash脚本条件判断

       1.四种条件测试方式:
        bash命令;
        [ expression ];
        [[ expression ]];
        test expression ;

   整数测试
            大于:-gt
            小于:-lt
            等于:-eq
            大等:-ge
            小等:-le
            不等:-ne
    命令执行状态返回值: 0-255
        0: 正确执行
        1-255: 错误执行
            exit [n]
                脚本执行的最后一条件命令的状态返回值;

    bash字符测试:
        >: 大于
        <: 小于
        ==: 等于
        =~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];
            [[ $opt1 =~ $opt2 ]] =~ 两侧要有空格
                只做行首、行尾锚定不可词尾锚定;字符串可以加引号(引用变量),模式不要加引号;

        单目:
            -z $STRING: 为空则为真,不空则为假; 如if [ -z $Shell ]; then

            -n $STRING: 为空则为假,不空则真;

  文件测试:操作符 文件路径
    -f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;
    -d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;
    -e: 测试文件是否存在;存在为真,否则为假;
    -r: 测试文件对当前用户来说是否可读;
    -w: 测试文件对当前用户来说是否可写;
    -x: 测试文件对当前用户来说是否可执行;
    -s: 测试文件大小是否不空,不空则真,空则假;

2.组合条件测试

短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;
    与运算:
        真 && 真 =  真
        真 && 假 =  假
        假 && {真|假} = 假

    或运算:
        假 || 0 = 0
        假 || 1 = 1

        真 ||   =1

[ -e /tmp/test10 ] || mkdir /tmp/test10

4.bash条件判断之多分支if语句:
语法格式:
    if 条件1; then
      语句1
      语句2
      ...
    elif 条件2; then
      语句1
      语句2
      ...
    elif 条件3; then
      语句1
      语句2
      ...
    else
      语句1
      语句2
      ...
    fi     

5.shift [n]:实现位置参数轮替; n为一次清除几个位置变量 默认为1

例子:通过参数传递n个正整数给脚本,求其和;
#!/bin/bash
#
Sum=0
for I in `seq 1 $#`; do
  Sum=$[$Sum+$1]
  shift
done

echo $Sum

四、实用例子

     1.使用包含3个参数的脚本便捷创建脚本文件

#!/bin/bash

if [ $# -ne 3 ]; then
  echo "the number of arguements is wrong."
  exit 4
fi

echo '#!/bin/bash' >> $3

if [ $1 == '-a' ]; then
  echo "# Author: $2" >> $3
elif [ $1 == '-d' ]; then
  echo "# Date: $2" >> $3
elif [ $1 == '-D' ]; then
  echo "# Description: $2" >> $3
else
  echo "Unknown option, ignore it."
  rm -f $3
  exit 5
fi

vim + $3     #用vim打开脚本文件

if bash -n $3 &> /dev/null; then
  chmod +x $3 
else
  echo "Syntax wrong in $3."
fi

六、bash脚本调试命令

脚本文件中,所有以#开头的行均为注释行,不会被执行;

检查脚本的语法错误,不执行脚本:
    bash -n /path/to/script_file.sh

调试执行脚本:
    bash -x /path/to/script_file.sh

你可能感兴趣的:(编译器,解释器,源程序)