zoukankan      html  css  js  c++  java
  • Bash基础

    Bash基础

    基本命与操作符

      # 注释,用于一行行首(#!除外)或本行空白的后边。

      ; 命令分隔符,可以在一行中写多个命令。

      ;; 终止case选项。

      . 等价于source命令,这是一个bash内建命令。

      . 作为文件名的前缀时,则该文件为隐藏文件。作为目录名的一部分.表示当前目录,..表示上一级目录。用于字符匹配中,作为正则表达式的一部分,用来匹配任何单个字符。

       部分引用,”STRING”阻止了一部分特殊字符。

      ' 全引用,’STRING’阻止了全部特殊字符。

      , 逗号连接了一系列算术操作,虽然里面的内容都被运行了,当只有最后一项被返回。

       转义字符

      / 文件名路径分隔符,或用来作除法。

       `后置引用,命令替换。

      : 空命令

      ! 取反操作符。

      * 万能匹配符,用于文件名匹配或正则表达式中。注意:*在正则表达式匹配中与文件名匹配中是不同的。数学运算。**幂运算。

      ? 测试操作,或在正则表达式中匹配任意单个字符。

      $ 变量替换,或在正则表达式中作为行结束符。

      $$ 变量的间接引用。

      ^ 正则表达式中表示行首。

      ${} 参数替换。

      $*, $@ 位置参数。

      $? 退状态变量。

      $$ 进程ID变量,保存了运行脚本进程ID。

      () 命令组。注意:在()中的命令列表将作为一个子shell来运行。

      {xxx, yyy, ...} 大括号扩展。

      {} 代码块,又称为内部组。事实上,这个结构创建了一个匿名函数,但是与函数不同的是,在其中声明的变量,对于脚本其它部分的代码来说还是可见的。

      {}; 路径名

      [] test

      [[]] test

      [] 数组元素,或正则表达式中作为字符匹配的一个范围。

      (()) 算术扩展和赋值,以及允许C风格的变量处理机制。

      > &> >> >& 重定向。

      <,> 正则表达式中的单词边界。

      | 管线。

      >| 强制重定向。

      +,-,*,/,**,% 算术操作符

      || 逻辑或

      && 逻辑与

       逻辑非

      << 左移一位

      <<=n 左移n位

      >> 右移一位

      >>=n 右移n位

      & 按位与

      &= 按位与赋值

      | 按位或

      |= 按位或赋值

       按位非

      ^, XOR 按位异或

      ^= 异或赋值

      & 后台运行命令。

      整数比较

    操作符 描述
    -eq 等于
    -ne 不等于
    -gt 大于
    -ge 大于等于
    -lt 小于
    -le 小于等于
    < 小于(需要双括号)
    <= 小于等于(需要双括号)
    > 大于(需要双括号)
    =
    大于等于(需要双括号)

      字符串比较

    操作符 描述
    = 等于
    == 等于
    != 不等于
    < 小于,ASCII值
    > 大于,ASCII值
    -z 字符串为null
    -n 字符串不为null

      文件测试操作

    操作符 描述
    -e 文件存在
    -f file是一个普通文件
    -s 文件长度是0
    -d 文件是个目录
    -b 文件是个块设备
    -c 文件是个字符设备
    -p 文件是个管道
    -h 文件是个符号链接
    -L 文件是个符号链接
    -S 文件是个Socket
    -t 关联到一个终端设备的文件描述符,可以用来测试一个给定脚本中的stdin[-t0]或[-t1]是一个终端
    -r 文件具有读权限
    -w 文件具有写权限
    -X 文件具有执行权限
    -g
    -u
    -k
    -O 是否为文件的拥有者
    -G 文件组id是否与文件拥有者的组id相同
    -N 从文件最后一次打开到现在,是否被修改
    f1 -nt f2 文件f1是否比f2新
    f1 -ot f2 文件f1是否比f2旧
    f1 -ef f2 f1和f2是否都硬连接到一个文件
    取反上面的测试结果

    Bash内建变量

      $BASH:Bash可执行文件的路径/bin/bash。

       $BASH_ENV:该变量指向一个Bash启动文件,这个启动文件将在调用一个脚本时被读取。

      $BASH_VERSION:Bash版本号,如:4.3.11(1)-release

      $BASH_VERSINFO:Bash版本信息,是一个6元素的数组。内容分别是主版本号、次版本号、Patch次数、Build version、release status、Architecture。

      $DIRSTACH:目录栈中栈顶的值。

      $EDITOR:调用默认编辑器。

      $EUID:有效用户ID号。

      $FUNCNAME:当前函数的名字。

      $GROUPS:当前用户所属的组。

      $HOME:用户的home目录。

      $HOSTNAME:系统名字

      $HOSTTYPE:系统类型,如i686

      $IFS:内部域分割符。

      $LINENO:记录shell脚本中该变量所在的行号。

      $MACHTYPE:系统类型。

      $OLDPWD:所在的之前的目录。

      $OSTYPE:操作系统类型。

      $PATH:系统搜索路径。

      $PIPESTATUS:保存管道的退出状态。

      $PPID:当前进程的父进程的进程ID。

      PS1PS2:第二提示符,以此类推。

      $PWD:当前工作目录。

      $RANDOM:产生随机整数。注意:它是Bash的内建函数,而不是常量。

    特殊参数 描述
    0,1,2...|0表示脚本名,$1表示第一个参数,以此类推
    $# 命令行或者位置参数的个数
    |* 必须被 “” 引用
    @|* 同义,但是每个参数都是一个独立的 “” 引用的字串,$@ 也必须被 “” 引用
    $! 在后台运行的最后的工作的进程ID
    $_ 保存之前执行的命令的最后一个参数
    $? 函数或脚本的退出状态
    $$ 脚本自身的进程ID

    字符串操作

      字符串长度

    ${#string}
    expr length $string
    expr "$string":'.*'

      提取子字符串

    ${string:position}
    ${string:position:length}

      删除子字符串

    #从string的左边删除第一个匹配的substring
    ${string#substring}
    #从string的左边删除最后一个匹配的substring
    ${string##substring}

      子串替换

    #使用replacement替换第一个匹配的substring
    ${string/substring/replacement}
    #使用replacement替换所有匹配的substring
    ${string//substring/replacement}

    参数替换

    ${parameter}
    
    #如果参数没有设置具体值,就使用默认值
    ${parameter-default},${parameter:-default}
    ${parameter=default},${parameter:=default}
    
    #如果paramerter被设置了,那就使用alt_value,否则就使用null字符串
    ${parameter+alt_value},${parameter:+alt_value}
    
    #如果parameter被设置了,那就使用设置的值,否则print err_msg
    ${parameter?err_msg}, ${parameter:?err_msg}

    declare或者typeset内建命令允许指定变量的具体类型,两个命令是等价的。参数选项如下:

    declare/typeset参数选项 描述
    -r 只读
    -i 整型
    -a 数组
    -f 函数
    -x export

    循环

    for arg in [list]
    do
        command(s)
        ...
    done
    
    #C风格
    for ((initialization; condition; change))
    do
        command(s)
        ...
    done
    
    while [condition]
    do
        command(S)
        ...
    done
    
    #C风格
    while ((condition))
    do
        command(s)
        ...
    done
    
    until [condition-is-true]
    do
        command(s)   
        ...
    done
    
    
    #同样也有循环控制命令
    break
    continue
    break N #跳出N重循环
    continue N #跳过本层N次循环
    
    #测试与分支
    case "$variable" in
    
    "condition1")
        command(s)
        ...
    ;;
    
    "condition2")
        command(s)
        ...
    ;;
    
    ...
    
    esac
    
    select variable [in list]
    do
        command(s)
        ...
        break
    done                

    函数

    function function_name 
    {
        command(s)
        ...
        [return](可选)
    }
    
    function_name()
    {
        command(s)
        ...
        [return](可选)
    }
    
    

    参考文档

    1. Advanced Bash-Scripting Guide
  • 相关阅读:
    Qt读取JSON和XML数据
    IOS设计模式学习(19)策略
    Android学习笔记(二)之异步加载图片
    ETL-Career RoadMap
    HDU 1501 & POJ 2192 Zipper(dp记忆化搜索)
    CodeForces 242E
    推荐:室内定位API
    基于单片机的电子密码锁的实现
    [nagios监控] NRPE: Unable to read output 的原因及排除
    (ubuntu)在andorid andk工程中使用ccache加速编译速度
  • 原文地址:https://www.cnblogs.com/corfox/p/5415001.html
Copyright © 2011-2022 走看看