码迷,mamicode.com
首页 > 其他好文 > 详细

bash编程

时间:2015-04-27 00:39:27      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:bash编程语言

前言

    bash(Bourne-Again SHell)是一种过程式编程语言、是人机交互接口,它是解释型语言(源程序->解释器去读取执行)也称为动态语言,解释型无法脱离解释器独立运行,bash是弱类型,保存变量方式一切皆字符。


概念

    脚本:将希望执行的命令罗列在文件中一起执行,bash没有库,整个程序都依赖于命令完成,在脚本中命令语句执行失败并不影响后续命令执行,如果语法错误后续所有命令将不再执行。

           

    格式:第一行用于指定解释器类型#!/bin/bash,其他以#开头的都为注释行。


     bash变量:

             本地变量 :只对当前shell进程有效,其他shell和子shell进程无效 

             环境变量:当前shell和子shell进程有效,其他 shell进程无效

             局部变量:对某shell脚本代码片段有效

             位置变量:记录所传参数对应信息,当传递参数大于等于10后需要{}如:${10},$#:显示传递参数的个数。$@和$*:显示所有参数内容、shift:把当前变量销毁让下一个变量取代当前变量位置

             特殊变量:有特殊意义的变量如:$?、$$


            控制语句:

                    顺序执行:

                    选择执行:多分支,当满足条件后执行对应分支,if和case,case有多个测试条件时,case语句会使得语法结构更清晰。

                    循环执行:同一段代码执行多次,必须有退出机制否则死循环,for、while、until,循环while和until(while适用于循环次数未知,或不便用for直接生成较大列表时使用)

                    循环执行中有2个命令可以控制循环跳出或结束操作

                    continue:跳出本次操作

                    break:跳出本循环


           变量赋值:向变量空间保存数据name=value。

           变量引用:读取变量空间数据echo ${name}。

           撤销变量:unset name。

           只读变量:readonly name(当设置为只读变量后变量值将不能修改和撤销)。

           查看当前shell进程中所有变量:set,

           查看当前shell中环境变量:export、printenv、env

           bash: 

                -n:scriptfile可做语法测试检查、

                -x:显示单步执行脚本结果


           bash配置文件:

                       profile类:为交互式登录用户提供配置

                                  全局:/etc/profile和/etc/profile.d/*.sh

                                  个人:~/.bash_profile

                        bashrc类:为非交互式用户提供配置

                                  全局:/etc/bashrc 

                                  个人:~/.bashrc


            bash操作符(+、-、*、/、%、**)这些称之为双目运算符


            整数比较:(-gt(>)、-lt(<)、-ge(>=)、-le(<=)、-eq(==)、-nq(!=))

            字符串比较:(<、>、=~(模式匹配)、==、!=)

                        还包括2个单目运算符:

                                -n 检查文件内容是否为空,不空为真,空为假

                                -z 和-n相反空为真,不空假

             文件测试:

                      -e:存在为真

                      -f:存在并且为普通文件

                      -d:存在并且为目录、

                      -l或-L:存在并为链接文件、

                      -s:存在并且为非空文件、

                      -b:块设备、

                      -c:字符设备、

                      -S:套接字文件、

                      -p:命名管道、

                      -r、-w、-x:存在并且可读、可写、可执行、

                      -nt: 双目运算 判断file1的mtime(修改时间)新于file2


              组合条件测试:(与(-a)&&、或(-o)||、非(-not)!)


              bash编程函数:函数名出现的地方,会被自动替换为函数体,函数可自定义返回值,还可以接受位置参数。


              bash数组:bash中只支持一维数组并且支持稀疏格式,在引用是必须使用${}查看相关值。


选择执行操作

       if:格式有三种

           1、 if 测试条件;then        2、if 测试条件;then     3、if 测试条件1;then
                  选择分支                    选择分支1                选择分支1
               fi                          else                     elif 条件2;then
                                              选择分支2                 分支2
                                           fi                       else 
                                                                         分支3
                                                                    fi

 if [ -d /media/sysroot$(dirname $i) ];then
              [ -f /media/sysroot$i ] || cp $i /media/sysroot$i
        elif [ ! -d /media/sysroot ];then
                mkdir -p /media/sysroot$(dirname $i)
              [ -f /media/sysroot$i ] ||  cp $i /media/sysroot$i
        else
             exit 3
        fi

      case:格式

                 case 变量引用 in

                 PATTERN1)

                           分支1

                            ;;

                  PATTERN2)

                            分支2

                           ;;

                   *)

                            分支n

                           ;;

                   esac

    

read -p "Please select the compression method(xz | gz | bz2):" Compression
etc="etc-`date +%Y-%m-%d-%H-%M-%S`"
case $Compression in
xz)
   tar Jcf "$etc.tar.xz" /etc/*
       if [ ! -d /backups ];then
            mkdir -p /backups
       fi

            mv "$etc.tar.xz" /backups/
       ;;
gz)
   tar zcf "$etc.tar.gz" /etc/*
       if [ ! -d /backups ];then
            mkdir -p /backups
       fi
            mv "$etc.tar.gz" /backups/
       ;;
bz2)
   tar jcf "$etc.tar.bz2" /etc/*
       if [ ! -d /backups ];then
            mkdir -p /backups
       fi
            mv "$etc.tar.bz2" /backups/
       ;;
*)
   echo "you inpot error:"
exit 5
;;
esac


循环执行操作

       for:格式

             for VAR_NAME in LIST;do 

                 循环体 

              done


for ((i=1;i<=9;i++));do
    for ((z=1;z<=$i;z++));do
         let tmp="$i*$z"
         arr[$z]="$i*$z=$tmp"
    done
         echo "${arr[@]}"
done

while测试条件为真,进入循环,until和while相反,判断为假进入循环

     while:格式                                              until:格式               

            while 测试条件;do                                       while 测试条件;do 

                   循环体                                                   循环体

            done                                                      done


数组操作

    赋值:

        一次对多个元素赋值:例如:array=(red blue yellow green)

        按索引进行赋值:    例如:array=([0]=green [3]=red [2]=blue [6]=yellow)

        命令替换赋值:      例如:array=($(ls /opt/script/))或array=(/etc/sysconfig/*)

        用户输入赋值:      例如:read -a array,赋值后用echo ${array[0]}查看


     bash取值:

              echo ${#array[2]}。获取这个数组字符的个数
              echo ${#array[*]}或echo ${#array[@]}。获取这个数组中变量个数

              echo ${array[@]}。取出所有元素

              ${ARRAY[@]:offset:number}。例如:echo ${array[@]:1:1}

                         offset: 偏移的元素个数

                         number: 取出的元素的个数


字符串操作

     字符串操作

        字符串切片:${string:offset:length}。例如:${array[1]:0:5}可以对该数组内1的变量截取0-5个字符串。

        取尾部指定个数的字符:${string: -length},中间需要有个空格,从右向左取多少个字符。例如echo ${string: -3}


       取子串:
        基于非贪婪模式:${string#*word}:从左向右截取第一次出现该字符串后的值例如:echo ${string#*a}
        基于贪婪模式:${string##*word}:从左向右截取最后一次出现该字符串后的值例如:echo ${string#*a}
               ${string%word*}:从右向左取第一次出现该字符串后的值。例如:echo ${string%a*}
               ${string%word*}:从右向左取最后一次出现该字符串后的值。例如:echo ${string%%a*}


        查找替换:

               ${string/pattern/substi}: 替换第一次出现。例如:echo ${string/d/xxx}
               ${string//pattern/substi}:替换所有的出现。例如:echo ${string//d/xxx}
               ${string/#pattern/substi}:只替换行首echo ${string/#d/xxx}
               ${string/%pattern/substi}:只替换行尾echo ${string/%d/xxx}

   

       查找删除:

               ${string/pattern}删除第一次出现的字符
               ${string//pattern}删除所有出现的字符
               ${string/#pattern}删除行首出现的字符
               ${string/%pattern}删除行尾出现的字符

 

       大小写转换:
                echo ${string^^}小-->大

                echo ${string,,}大-->小


      变量赋值:${parameter:-word}:如果变量值为空将显示指定字符串,不空显示自身已有值,例如:${string:-test}
                ${parameter:=word}:如果变量值为空将显示指定字符串,变量将被赋值。例如:${string:=test}
                ${parameter:?word}:如果变量为空将把指定字符串作为错误信息显示。${string:?error} 
                ${parameter:+word}:如果变量有值将显示指定字符串,为空将显示空。例如:${string:+xxxx}

bash编程

标签:bash编程语言

原文地址:http://5990383.blog.51cto.com/5980383/1638805

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!