首页 > 代码库 > bash脚本基础

bash脚本基础

编程基础:程序:指令+数据
                过程式:以指令为中心,数据服务于指令
                对象式:以数据为中心,指令服务于数据
shell程序:提供了编程能力,解释执行
编程语言:低级:汇编
               高级:
                        编译:高级语言–>编译器–>目标代码    java,c#
                        解释:高级语言–>解释器–>机器代码    shell,perl,python
编程逻辑处理方式:
                顺序执行
                循环执行
               选择执行
                           shell编程:过程式、解释执行
编程语言的基本结构:
                          各种系统命令的组合
数据存储:变量、数组
表达式:a + b   
语句:if
shell脚本:包含一些命令或声明,并符合一定格式的文件
格式要求:#!/bin/bash
               #!/usr/bin/python
               #!/usr/bin/perl
shell脚本的用途:
                    自动化常用命令
                    执行系统管理和故障排除
                    创建简单的应用程序
                   处理文本或文件
shell脚本的创建:
                   使用文本编辑来创建文本文件
                   第一行必须包括shell声明序列:#!/bin/bash    
                  #注释行 (可以写上时间,作者,做什么用)
写完后运行脚本:
                      bash -n file  检测脚本中的语法错误,但不能检查命令错误
                      bash -x file  调试执行,可以检查命令错误
                      chmod +x file 后 建议使用bash file 运行    
变量:
字符型:
数值型:整型,浮点型
变量命名法则:
        1 、不能使程序中的保留字:例如if, for
        2 、只能使用数字、字母及下划线,且不能以数字开头
        3 、见名知 义
        4 、统一命名 规则:驼峰命名法
强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误    如: java,c

弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
       如:bash  不支持浮点数,python

bash中的变量种类:
            本地变量:生效范围为当前shell 进程;对当前shell 之外的其它shell 进程,包括当前shell 的子shell 进程均无效
            环境变量:生效范围为当前shell进程及其子进程
            局部变量:生效范围为当前shell 进程中某代码片断( 通常指函数)

            位置变量:$1, $2, … 来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

 

变量赋值:name=‘value’
      可以使用引用value:
             (1)  可以是直接字串; name=“root”
             (2)  变量引用:name=”$USER”
             (3)  命令引用:name=COMMAND name =$(COMMAND)
       变量引用:$name
                       “” :弱引用,其中的变量引用会被替换为变量值
                        ” :强引用,其中的变量引用不会被替换为变量值,而保
持原字符串
?  显示已定义的所有变量:set
?  删除变量:unset name

变量声明、赋值:  定义环境变量
                    exprot name=value
                    declare -x name=value
显示所有环境变量:
                        export
                        env
                        printenv
                       删除定义的变量:unset name    (养成习惯,每次在结束后删除定义的变量)
bash 有许多内建的环境变量: :PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE

只读变量:只能声明,但不能修改和删除
声明只读变量:
                readonly name
                declare -r name
查看只读变量:
                readonly -p

位置变量:在脚本代码中调用通过命令行传递给脚本参数
$1, $2, … :对应第1 、第2 等参数,shift [n]
        $*:  传递给脚本的所有参数,全部参数合为一个字符串
        $@:  传递给脚本的所有参数,每个参数为独立字符串
        $#:  传递给脚本的参数的个数
        $@ $*  只在被双引号包起来的时候才会有差异
        set —  清空所有位置变量

当位置参数达到10以上需要加上大括号 比如 ${10} ${11} 

      $0     脚本名 使用basename可以取基名
      shift #  清理单独的位置参数#清理多少个 
bash 中的算术运算:help let
                          +, -, *, /, % 取模(取余), ** (乘方)
实现算术运算:
(1) let var= 算术表达式
(2) var=$[ 算术表达式]       (建议使用中括号,方便查看脚本)
(3) var=$(( 算术表达式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var =  数值
(6) echo ‘ 算术表达式’ | bc
       乘法符号有些场景中需要转义 ,如*
bash 有内建的随机数生成器:$RANDOM (1-32767)
                                        echo $[$RANDOM%50]  :0-49 之间随机数

增强型赋值:
               +=, -=, *=, /=, %=
               let varOPERvalue

               自增,自减:

                            j=i++   先赋值给j,然后再加1
                            j=++1   先加1赋值给j,

 

                       
逻辑运算: ||     &&    !
                异或:^     异或的两个值,相同为假,不同为真
进程使用退出状态来报告成功或失败
               ? 0 代表成功,1 -255 代表失败
               ? $?  变量保存最近的命令退出状态

条件测试:
               判断某需求是否满足,需要由测试机制来实现
               专用的测试表达式需要由测试命令辅助完成测试过程 
评估布尔声明,以便用在条件执行中
              若真,则返回0
              若假,则返回1
测试命令:
? test EXPRESSION
            ? [ EXPRESSION ]
            ? [[ EXPRESSION ]]
        注意:EXPRESSION 前后必须有空白字符
            $ [ “$A” == “$B” ] && echo “Strings are equal”
            $ [ “$A” -eq “$B” ] && echo “Integers are equal”

根据退出状态而定,命令可以有条件地运行   &&     ||

        数值测试:
               -gt:  是否大于             -ge:  是否 大于等于
               -eq:  是否等于             -ne:  是否 不等于
               -lt:  是否小于               -le:  是否 小于等于

        字符串测试:
                        == :是否等于;
                           >: ascii 码是否大于ascii码
                           <:  是否小于
                          !=:  是否不等于
                         =~:  左侧字符串是否能够被右侧的PATTERN所 所 匹配
注意:  此表达式一般用于[[ ]] 中;扩展的正则表达式
                         -z “STRING” :字符串是否为空,空为真,不空为假
                         -n “STRING” :字符串是否不空,不空为真,空为假
               注意:用于字符串比较时的用到的操作数都应该使用引号

文件测试:
-e FILE:  文件存在性测试,存在为真,否则
-d FILE:   是否存在且为目录文件
-b FILE:   是否存在且为块设备文件
…….
文件权限测试:-r    -w     -x    是否存在且有权限 
特殊权限测试:-u    -g     -k    是否存在且有特殊权限
文件大小测试:-s         是否存在且非空
文件是否打开:-t fd   fd 表示文件描述符是否已经打开且与某终端相关      -N FILE :文件自动上一次被读取之后是否被修改过 
 -O FILE : 当前有效用户是否为文件属主
 -G FILE :当前有效用户是否为文件属组
双目测试:
FILE1 -ef FILE2: FILE1 与FILE2 是否指向同一个设
备上的相同inode
FILE1 -nt FILE2: FILE1 是否新于 于FILE2
FILE1 -ot FILE2: FILE1 是否旧于 于FILE2

组合条件测试:
第一种方式:
COMMAND1 && COMMAND2  并且
COMMAND1 || COMMAND2  或者
! COMMAND 非 
如:[[ -r FILE ]] && [[ -w FILE ]]
第二种方式:
EXPRESSION1 -a EXPRESSION2  并且
EXPRESSION1 -o EXPRESSION2  或者
! EXPRESSION
必须使用测试命令进行

使用read命令来接受输入:
                               -p 指定要显示的提示
                               -s 静默输入
                               -n N  指定输入的字符长度N
                               -d ‘ 字符’ 输入结束符
                               -t N TIMEOUT 为N秒
                       read 从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量
                       read -p “Enter a filename: “ FILE

bash如何展开命令行
   把命令行分成单个命令词
   展开别名
   展开大括号种的声明({})
   展开波浪符声明(~) 
   命令替换$() 和 “) 
   再次把命令行分成命令词
   展开文件通配(* 、? 、[abc] 等等)
   准备I/0 重导向(< 、>) 
   运行命令

防止扩展:反斜线(\ )会使随后的字符按原意解释
              加引号来防止扩展
             ?  单引号(’ )防止所有扩展
             ?  双引号(” )也防止所有扩展,但是以下情况例外:
                 $ (美元符号) - 变量扩展
                  ` (反引号) - 命令替换
                  \ (反斜线) - 禁止单个字符扩展
                  ! (叹号) - 历史命令替换

bash的配置文件:
按生效范围划分,存在两类:
           全局配置:
                        /etc/profile
                       /etc/profile.d/*.sh
                       /etc/bashrc
           个人配置:
                       ~/.bash_profile
                       ~/.bashrc
修改profile 和bashrc 文件后需生效
         两种方法:
                       1 重新启动shell 进程

                       2 .  或source    (使用source)

bash退出任务:
                保存在~/.bash_logout 文件中(用户)
                在退出登录shell 时运行
         用于
               ? 创建自动备份
               ? 清除临时文件

bash脚本基础