bash shell编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash shell编程相关的知识,希望对你有一定的参考价值。

命令行编辑

光标跳转

    ^a 跳到命令行首 

    ^e 跳到命令行尾

    ^<- 向左跳转一个单词

    ^-> 向右跳转一个单词

    ^b    左移一个字符

    ^f    右移一个字符

删除

    ^u 删除光标至命令行首的内容

    ^k 删除光标至命令行尾的内容

    ^d 删除光标所在处的字符

    ^h  = BackSpace功能

    ^l  清屏

Bang (!) 命令

    !!     执行上一条命令

    !blah    执行最后一次以blah开头的命令

    !$    上一条命令的最后一个参数 (Esc+. 和Alt+.都是效果相同的 引用最后一个参数)

    !*     上一条命令的所有参数


history     查看命令历史(用户正常退出时,命令历史会保存到用户目录中的.bash_history)

    -c     清除命令历史

    -d OFFSET [N]  删除指定位置的命令历史

    -w  保存命令历史到历史文件(默认为.bash_history   history -w FileName 也可以保存指定的文件中)

    

    命令历史的使用技巧

        !N    执行第N条命令

        !-N    执行倒数第N条命令

         !!    执行上一条命令

        !KEY    执行历史命令中最后一条以KEY关键字开头的命令


环境变量    

PATH:    命令搜索路径

HISTSIZE     命令历史缓冲区大小 (默认为1000)

 

       命令别名 (仅在当前shell生命周期中有效,别名的有效范围仅为当前shell进程)

alias 

    alias CMDALIAS=‘COMMAND [options] [arguments]‘

取消别名

unalias CMDALAS

使用别名原意的

 \CMDALIAS

命令替换

把命中某个子命令替换为其执行结果的过程

   格式  1、$(COMMAND)   2、`COMMAND`

                

bash支持的引号

   1、 双引号 “”弱引用,可以实现变量替换。用双引号将文本括起来可以阻止shell对大多数特殊字符进行解释。eg 在双引号中括号并不是注释的开通它只是表示一个普通的符号#。然而$ ` 和“字符仍然保持着它的特殊含义,对于这些字符使用\ 可以去除他们的特殊含义

    2、单引号   ‘ ‘ 强引用不完成变量替换。 阻止所有字符的转义

    3、反引号  ` `    进行命令替换。在反引号内的shell命令将会被执行(另一种也可以执行shell命令的为  $(COMMAND)  ),其结果输出替换反引号括起来的内容

 

文件名通配符  globbing

    ?    匹配文件名中的任意单一字符  (正则表达式中 表示匹配前一个字符的零次或一次)

    *    匹配文件名中任何字符串,包括空字符  (正则表达式中 表示匹配前一个字符的零次或多次)

    […]    匹配[]中所包含的任意单一字符

    [!…] 和[^…]   匹配[]中非感叹号!之后的字符 

 

  字符集合:(man 7 glob 可以获得以下帮助)

    [:space:]    空白字符集

    [:punct:]    标点符号    

    [:lower:]    小写字母

    [:upper:]    大写字母

    [:alpha:]    大小写字母

    [:digit:]      数字

    [:alnum:]    数字和大小写字母

    [:graph:]    非空字符(非空格和控制字符)

    [:print:]       类似[:graph:] ,但是包括空格

    [:cntrl:]        控制字符

    [:xdigit:]      允许十六进制格式的数字

    例如: [[:alpha:]]*[[:space:]]*[[:alpha:]]    表示文件中包含空白字符的

                [^[:digit:]]*    表示以非数字开头的

    

站在用户登录的角度来说,shell的类型

    登陆式shell:

        正常通常登陆终端登录

        su - USERNAME

        su -l USERNAME

    非登陆式shell:

        su USERNAME

        图形终端打开的shell

        自动执行的shell脚本


bash的配置文件:(全局配置和个人配置都有相同的以作用范围小为准)

    全局配置

        /etc/profile, /etc/profile.d/*.sh, /etc/bashrc

    个人配置

        ~/.bash_profile, ~/.bashrc


    profile类的文件

        设定环境变量

        运行命令或脚本


    bashrc类的文件

        设定本地变量

        定义命令别名        


登陆式shell如何读取配置文件

    /etc/profile ——> /etc/profile.d/*.sh ——> ~/.bash_profile ——> ~/.bashrc ——> /etc/bashrc

非登陆式shell读取配置文件流程

    ~/.bashrc ——> /etc/basrc ——> /ec/profile.d/*.sh


echo命令介绍

     echo [-ne]    字符串

            -n  不要在最后自动换行

            -e   激活转义字符

转义字符

\a发出警告声
\b

删除前一个字符

\c

最后不加上换行符

\f  \v换行但光标仍旧停留在原来的位置

\n

换行且光标移至行首
\r光标移至行首,但不换行

\t

插入tab

\\

插入\

    

echo -e "\033[40:35m  输出文本”输出文本颜色显示

背景色范围:40-49

字体颜色范围:30-39

40:黑色

30:黑色

41:深红

31:红

42:绿色

32:绿色

43:黄色

33:黄色

44:蓝色

34:蓝色

45:紫色

35:紫色

46:深绿

36:深绿

47:白色

37:白色



    

 编译器,解释器

编程语言:机器语言、汇编语言、高级语言


变量类型特点语言类
静态语言强类型  变量在使用前,必须事先声明,甚至还需要初始化编译型语言  事先转换成可执行的格式 C ,C++ ,JAVA ,C#
动态语言弱类型  变量用时声明,甚至不区分类型解释型语言 边解释边执行asp,aps.net,php ,shell 
python ,perl

编程模型

    面向过程

    面向对象

bash变量类别:

    环境变量(全局变量):

    本地变量(局部变量):

    位置变量:

    特殊变量:

注:1、脚本在执行时会启动一个子shell进程

    2、命令行中启动的脚本会继承当前shell环境变量

    3、系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量

环境变量(全局变量) 作用域为当前shell进程及其子进程,

    export VARNAME=VALUE

    VARNAME=VALUE;export VARNAME

本地变量作用域为当前shell进程

    VARNAME=VALUE 

局部变量作用域为当前代码段

    local VARNAME=VALUE 


位置变量

    $0 获取当前执行的shell脚本的文件名,包括脚本路径

    $n 参数或者命令本身,$1 表示脚本的第一个参数

    $* 参数列表(整体)

    [email protected] 参数列表

    $# 参数的个数

    $_  表示命令的最后一个参数

    

  shift n 参数从左边依n踢出(在脚本中使用shift 参数1会踢出,之前参数2变成参数1)

特殊(预定义)变量

    $? 上一条命令执行状态的返回值(0-255,0:正确执行, 2-权限拒绝、126-找到命令,但是无法执行 127-未找到该命令  系统预留)

    $$ 所运行命令的PID

    $!    代表最后执行的后台命令的PID

撤销变量

    unset VARNAME

查看当前shell中变量(环境变量和本地变量)

    set

查看当前shell中的环境变量

    env

    export

    printenv

变量引用方式:

  1、  ${VARNAME} 

   2、 $VARNAME

命令替换

    1、·command`

    2、$(command)

变量类型:(事先确定数据的存储格式和长度)

    字符型

    数值型

        整型

        浮点型

    布尔型

变量赋值

    VAR_NAME=VALUE

变量子串的常用操作

表达式说明
${#string}返回$string 的长度
${string:position}在$string中,从位置$position之后开始提取子串
${string:position:length}在$string中,从位置$position之后开始提取长度为length子串
${string#substring}从变量$string开头开始删除最短匹配$substing子串
${string##substring}从变量$string开头开始删除最长匹配$substring子串
${string%substring}从变量$string结尾开始删除最短匹配$substring子串
${string%%substring}从变量$string结尾开始删除最长匹配$substring子串
${string/substring/replac}使用$replac 来代替第一个匹配的$substring
${string/#substring/replac}如果$string 前缀匹配$substring 就用$replace 来代替匹配$substring
${string/%substring/replac}如果$string 后缀匹配$substring 就用$replace 来代替匹配$substring

逻辑运算

    与运算 &&

    或运算 ||

    非运算 !

    异或运算 

条件测试的表达式:

    [ expression ]    命令测试

    test expression

     [[ expression ]]  关键字测试


条件测试类型:

类型表达式描述
整数测试  
[ num1 OPERATOR num2 ]
-qe 测试两个数是否相等 equal
-ne不等于 not equal
-gt大于 greater than
-ge大于等于 greater equal
-lt小于 less than
-le小于等于 less equal
==是否等于
字符测试
[ char1 OPERATOR char2 ]
!=不等于
-z  string测试字符串是否为空,空则真,不空为假
-n string测试指定字符串是否不为空
文件测试 
[ OPERATOR file | dir ]
-e目标是否存在
-d是否为目录
-f 是否为文件
-r是否有读权限
-w是否有写权限
-x是否有执行权限
逻辑测试
[ 表达式1 ] OPERATOR [ 表达式2 ]
-a 或 &&逻辑与 第一个条件为假时,第二个条件不用再判断,最终结果为假
-o 或 ||逻辑或 第一个条件为真时,第二个条件不用再判断,最终结果为真
!逻辑非

  

定义脚本退出状态码

    exit 退出脚本

    exit n    设定退出状态码

  如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的状态码即为脚本的状态码 

bash中可以判断语法错误的语句(不完全可靠)

    bash -n 脚本名  语法错误测试

    bash -x 脚本名  (逐步执行语句) set +|- 可以开启关闭功能 -o 可以查看

shell中如何进行算术运算

      a=3

      b=6

    1、let 算术运算表达式

        let c=$a+$b

        let SUM+=$i 

        let I+=1、  I++

        let I -=1、  I--

    2、$[算术运算表达式]

        c=$[$a+$b]

    3、$((算术运算表达式))

        c=$(($a+$b))

    4、expr 算术运算表达式 (表达式中各操作数及运算符之间要有空格,而且要使用命令引用)

        c=`expr $a + $b`

面向过程

    控制结构

        顺序结构

        选择结构

        循环结构

A、选择结构

    if:单分支,双分支,多分支

    case语句:多分支

一、if判断语句

    1、单分支if语句

        if 判断条件;then

            statement1

            statement2

            .....

        fi

    2、双分支if语句

        if 判断条件;then

            statement1

            statement2

            .....

        else

            statement3

            statement4

            .....

        fi

    3、多分支if语句

        if 判断条件1;then

            statement1

             .....

        elif 判断条件2

            statement2

            ......

        elif 判断条件3

            statement3

            ......

        elif 判断条件4

            statement4

            ......

        else

            statementN

            ......

             fi

二、case语句:

    case SWITCH in

        value1)

            statement

            ...

            ;;

        value2)

            statement

            ...

            ;;

        ...

        *)

            statement

            ...

            ;;

    esac

B、循环结构 (循环:进入条件,退出条件)

    for:

    while:适用于循环次数未知的场景,要有条件满足退出循环

    until

一、for循环

    1、for 变量 in 列表;

        do

            循环体

        done

    2、for ((expr1;expr2;expr3));do

            循环体

       done

    如何生成列表

    {1..100}

    `seq 起始数 步进长度 结束数`

二、while循环

    进入循环:条件满足

    退出循环:条件不满足

        while CONDITION;do

            statement

            ...

        done

三、until循环

    进入循环:条件不满足

    退出循环:条件满足

        until CONDITION;do

            statement

            ...

        done

三种方式清空文件的方式

#echo  > FileName      (次操作会添加一个空行)

#> FileName 

#cat /dev/null >FileName

shell脚本开发基本规范及习惯

1)开头指定脚本解释器   #!/bin/bash

2) 开头田间版本等信息

    #Author:wp

    #Date: 20160719

    #Mail:[email protected]

    #Description:This is test

3)代码书写习惯

    1、成对出现内容一次写出来,如

          []、{}、“”、‘’

    2、流程控制语句一次写出来,再添加控制中的内容,如if、for、

        if   条件内容;then

            内容

        fi

    3、流程控制需要缩进方式


shell函数

function 函数名() 

    {

        命令1

        命令2

        ……

    }

函数的参数传递


以上是关于bash shell编程的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换

Shell编程Shell中Bash变量-数值运算运算符变量测试和内容替换

Shell编程Shell中Bash变量-环境变量

Shell编程Shell中Bash变量-环境变量

linux shell编程bash编程shell教程bash教程shell文档bash文档shell脚本bash脚本教程第一部分:绪论

linux的shell编程中#!/bin/sh和bash是啥意思?