shell脚本编程

偶尔善良 提交于 2019-12-04 15:38:44

 

一、Shell中的变量

  任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识。

1、默认变量

$0  当前脚本名称

$1  脚本接收的第一个参数

$2  脚本接收的第二个参数

$#  脚本接收的所有参数个数

$@  脚本接收的所有参数

$*  脚本接收的所有参数

$?  前一行命令的执行状态

2、变量定义及赋值

赋值处必须为一个整体,不能有空格。想要包含空格,需要用单引号或双引号包围。单引号()和双引号()的区别:单引号中保持原样输出。而双引号中会替换成其变量值。

3`符号

在该符号中的命令会被执行。可以用$()替换

4、命令行交互read

  read命令的使用形式为

    read [-pt] variable

      参数p:后面可以接提示符

      参数t:后面可以接秒数

5、定义变量类型declare

  默认情况下,变量的赋值内容都是字符类型的。

  declare命令的使用形式如下:

    declare [-aixr] variable

      参数a:将variable定义为数组

      参数i:将variable定义为整型(integer)

      参数x:将variable设置成环境变量,类似于export的作用

      参数rvariablereadonly类型,值不能被更改

二、Shell中的集合类型

1、数组(array)

1)数组定义和赋值

  数组中的元素用括号包围,各元素之间用空格隔开,可以重新设置指定元素的内容 。

2)数组元素访问

数组元素下标从0开始,想要访问指定位置的元素,使用[]指定下标值

3)获取数组长度

  获取数组长度使用如下命令

echo ${#array_name[@]}

  获取数组中单个元素的长度使用如下命令

echo ${#array_name[2]}

2map

定义map变量     declare -A m=(["a"]="1" ["b"]="2")

输出所有的key   echo ${!m[@]}

输出所有的value  echo ${m[@]}

输出指定key对应的value  echo ${m["a"]}

map中键值对的个数   echo ${#m[@]}  

三、Shell中的字符操作

1、字符串删除

  删除前面的http://     echo ${str#http://}

  删除后面的a   echo ${str%/a}

  #从前往后截取,%从后往前截取。如果使用两个#,或者两个%,则表示将符合的最长数据删除。

2、字符串截取

  可以从字符串的指定位置开始截取,同时可以指定截取的位数,如下所示:

echo ${str:2}     // 从第二位开始截取到最末尾,第一个字符下标为0

echo ${str:2:3}     // 从第二位开始顺序截取三个字符

3、字符串替换

  将http替换成HTTP    echo ${str/http/HTTP}

使用一个斜杠(/)表示只替换第一个遇到的字符。使用两个斜杠(//)则表示替换全部符合的字符。使用#匹配以指定字符开头的字符串。使用%匹配以指定字符开头的字符串。

4、字符串默认值

  如果变量没有赋过值,则给一个默认值,否则使用指定的值。如果变量内容为“”或者变量未初始化则给默认值,可以在-前加个冒号使用。

5、字符串长度

  求字符串长度用#操作   echo ${#str}

6、字符串包含

  有时候需要判断字符串str1中是否包含字符串str2,使用=~操作符。

  if [[ $str1 =~ $str2 ]];then

四、Shell中的控制结构

1、条件表达式

1if then

    if [ 判断条件1 ]; then

  执行内容1

    elif [ 判断条件2 ]; then

      执行内容2

    else

      执行内容3

    fi  

a)算术运算符

b)关系运算符

常用的关系运算符包括

-eq 检测两个数是否相等,相等返回 true

-ne 检测两个数是否相等,不相等返回 true

-gt 检测左边的数是否大于右边的,如果是,则返回 true

-lt 检测左边的数是否小于右边的,如果是,则返回 true

-ge 检测左边的数是否大等于右边的,如果是,则返回 true

-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 

c)布尔运算符

  常用的布尔运算符如下

!   非运算,表达式为 true 则返回 false,否则返回 true

-o  或运算,有一个表达式为 true 则返回 true

-a  与运算,两个表达式都为 true 才返回 true。 

d)字符串运算符

  常用的字符串运算符如下

=   检测两个字符串是否相等,相等返回 true

!=  检测两个字符串是否相等,不相等返回 true

-z  检测字符串长度是否为0,为0返回 true

-n  检测字符串长度是否为0,不为0返回 true

str 检测字符串是否为空,不为空返回 true

-b file 检测文件是否是块设备文件,如果是,则返回 true

-c file 检测文件是否是字符设备文件,如果是,则返回 true

-d file 检测文件是否是目录,如果是,则返回 true

-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true

-g file 检测文件是否设置了 SGID 位,如果是,则返回 true

-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true

-p file 检测文件是否是具名管道,如果是,则返回 true

-u file 检测文件是否设置了 SUID 位,如果是,则返回 true

-r file 检测文件是否可读,如果是,则返回 true

-w file 检测文件是否可写,如果是,则返回 true

-x file 检测文件是否可执行,如果是,则返回 true

-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true

-e file 检测文件(包括目录)是否存在,如果是,则返回 true。  

2、循环表达式

1while do done, untile do done

  while循环的格式如下

    while [ condition ]

    do

      程序

    done

  与while循环相反的是until循环。

    while [ condition ]

    do

      程序

    done

  在while循环中,当条件满足使,就执行其中的程序。而until循环中,当条件不成立时就终止循环。

2for do done

  for循环的格式如下

    for var in con1 con2 con3 ...

    do

      程序

    done

3for do done的另一种形式

  for循环的另一种个数如下

    for ((初始值; 目标值; 步长))

    do

      程序

    done

五、Shell中的函数

1、函数定义

Shell是从上往下执行的,所以在定义函数之前就调用该函数的话,会提示command not found  

2、函数参数与shell参数

Shell中定义的函数,是可以传递和接收参数的。在子函数中,$1表示接收的第一个参数…。但是测试后发现$0表示的仍然是shell名称。如果想要显示当前函数名,可以使用$FUNCNAME参数

    function printStr() {

      echo "printStr function print: $FUNCNAME"

      echo "printStr function print: $*"

    }

    echo "main print: $0"

    echo "main print: $*"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!