zoukankan      html  css  js  c++  java
  • Linux上层应用-->Shell scripts基础规范

    Shell scripts 的基本格式:

    1、文件开头加入shell类型指定: #!/bin/bash

    2、注释使用'#',仅支持单行注释

    3、语句结尾没有分号

    4、参数及命令多用空格分隔

    Shell scripts 中可以取得的默认特殊变量:

    ${0}:当前运行脚本的文件名

    ${n}:n为数字大于或等于1,代表当前脚本输入的第n个参数的内容。

    ${#}:传递给脚本或函数的参数个数。

    ${*}:传递给脚本或函数所有参数的集,当被双引号包含时(也就是“${*}”),参数集输出会是一个整体(也就是"${1} ${2}...")。

    ${@}:传递给脚本或函数所有参数的集,双引号包含还是不包含输出结果一样。

    ${?}:上一个命令执行后的输出状态,返回0表示执行成功,否则失败。

    ${$}:当前运行脚本进程ID。

    变量的替换原则:

    ${val:-new}:若变量不存在,返回new且不改变val

    ${val:=new}:若变量不存在,返回new且改变val

    ${val:?new}:若变量不存在,返回new到stderr且不改变val

    ${val:+new}:若变量不存在,创建val。否则返回new

    运算符:

    算术运算符

     算术运算使用格式$((运算内容)),比如:$((${a}+${b}))

    注意:上面的运算格式,仅仅支持整数运算,浮点运算需要通过bc、awk等工具实现!

    目前支持的算术运算符如下(与c/c++运算符一样):

    +:加法

    -:减法

    *:乘法

    /:除法

    %:取余

    =:赋值

    关系运算符

    注意:

    1、关系运算符也仅仅支持整数运算

    2、[]与其中的组件都需要有空格分隔,如[ "a" == "b" ]

    3、组件必须用双引号包含!如[ "${a}" == "b" ]

    目前支持的关系运算符如下(满足关系返回true,否则会false):

    ==:相等

    !=:不相等

    -eq:(equal)相等

    -ne:(not equal)不相等

    -gt:(greater than)左值是否大于右值

    -lt:(less than)左值是否小于右值

    -ge:(greater than or equal)左值是否大于或等于右值

    -ls:(less than or equal)左值是否小于或等于右值

    布尔运算:

    !:非运算,逻辑结果取反

    -a:(and)与运算,两个表达式都为真才返回true

    -o:(or)或运算,两个表达式其中一个为真就返回true

    字符串运算符:

    =:是否相等

    !=:是否不等

    -z:(zreo)是否为空

    -n:是否不为空

    文件测试运算符:

    -e:文件是否存在

    -f:是否为普通档案

    -d:是否为目录

    -b:是否为块设置

    -c:是否为字符设备

    -S:是否为Socket文件

    -p:是否为管道(FIFO)文件

    -L:是否为链接

    -r:是否有读权限

    -w:是否有写权限

    -x:是否有执行权限

    -u:是否有SUID属性

    -g:是否有SGID属性

    -k:是否有粘着位(Sticky bit)

    -s:是否存在且为非空档案

    -nt:(newer than)左边档案是否比右边档案新

    -ot:(older than)左边档案是否比右边档案旧

    -ef:左右是否为同一档案,在判断硬链接比较有用

    字符串:

    获取字符串长度: echo ${#val} (在val前面加#)

    提取字符串: echo ${val:n:m}(提取字符串n到m之间的字符串,以0开始)

    数组:

    注意:目前Shell仅仅支持一维数组,也是从下标0开始

    定义数组:val=(val0 val1 val2...) (用空格隔开元素)

    单独改变: val[n]=val0

    读取元素:valn=${val[n]} (若不带下标,默认是0号元素,使用@或*获取全部元素)

    printf:

    printf用法与c/c++类似,但是格式不一样:

    printf  format-string  [arguments...]

    format-string->使用双引号,与C一样

    arguments->参数之间用空格做分隔

    if else :

    与c/c++逻辑类似,格式略不同:

    if [ expression ] (注意[]中的空格分离)
    
    then
    
       ......
    
    fi
    
     
    
    if [ expression ] (注意[]中的空格分离)
    
    then
    
      ......
    
    else
    
      ......
    
    fi
    
     
    
    if [ expression ] (注意[]中的空格分离)
    
    then
    
      ......
    
    elif [ expression ] (注意[]中的空格分离)
    
    then
    
     ......
    
    else
    
     ......
    
    fi

    case ...esac :


    与c/c++逻辑一样,根据val值匹配val1..valn,若无匹配则跳转到*选项,每个选项以;;结尾。

    当多个选项输出同一结果时,用'|'组合。

     1 case val in
     2 
     3  val1)
     4 
     5     ;;
     6 
     7  val2)
     8 
     9     ;;
    10 
    11   *)
    12 
    13     ;;
    14 
    15 esac

    for循环:

    1 for 变量 in 列表
    2 do
    3 command1
    4 command2
    5 ...
    6 commandN
    7 done

    列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。

    in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

    注意:列表可以使用通配符等技巧,实现多种参数输入

    while循环:

    1 while command
    2 do
    3 
    4   ....
    5 
    6 done

    当command执行命令为真,就执行do中内容

    until循环:

    until循环逻辑与while相反,command为假就执行内容

    1 until command
    2 
    3 do
    4 
    5   ......
    6 
    7 done

    跳出循环:

    break后可以接数字,代表跳出到第几层循环。若不接数字,默认跳出到最大循环。若数字大于最大循环,则跳出最大循环。

    continue代表直接进入下一次循环,和c/c++一样。

    函数:

    1 FunctionName()
    2 {
    3   .........
    4 }

    注意:

    1、函数名括号中不能带有参数。

    2、函数也有返回值,同样通过${?}取得

    3、调用函数直接输入函数名,但后面不能跟括号

    4、函数参数在函数名后输入,空格分隔各参数,${n}取第n个参数,从1开始

    文件调用:

    bash也可以包含其他shell文件,使用格式:

    source File
    或
    . File(注意空格)

    shell scripts 调试:

    使用sh [-nvx] file.sh命令调试脚本

    -n:不执行scripts,仅检查语法

    -v:先将scripts内容输出到屏幕上,再执行

    -x:将scripts执行过程中使用到的内容都输出到屏幕上

  • 相关阅读:
    VMI
    jsp环境搭建(Windows)
    128M小内存VPS优化与typecho环境搭建
    Shell字符串
    bash和sh区别
    PHPDocument 代码注释规范总结
    PHP 程序员的技术成长规划
    JavaScript:JSON
    mongoDB 使用手册
    PHP面向对象的标准
  • 原文地址:https://www.cnblogs.com/KcMeterCEC/p/5361681.html
Copyright © 2011-2022 走看看