zoukankan      html  css  js  c++  java
  • linux —— shell 编程(编程语法)

    导读

    本文为博文 linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展。(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行)


    目录
    1. 再识变量
    2. 函数
    3. 条件语句
    4. 循环语句
    1、再识变量

    Shell 中有3种变量:用户变量、位置变量、环境变量

    用户变量

    用户变量就是用户在Shell编程过程中定义的变量,分为全局变量和局部变量。默认情况下,用户定义的变量为全局变量,如果要指定局部变量,需要使用local限定词

    1)Shell 中的特殊符号:

    特殊字符列表如下:

    ~    主目录,相当与$HOME

    `     命令替换,如 echo `pwd`

    #    脚本注释

    $    变量表达式符号

    &    后台作业,将此符号置于命令末端则让命令与后台运行

    *    字符串通配符

    (  )   ( 启动子Shell    ) 停止子Shell

        转义下一个字符

    |    管道

    [  ]    [ 开始字符集通配符号  ] 结束字符集通配符号

    {  }   { 开始命令块    }结束命令块

    ;    Shell 命令分隔符     

    '  "    强引用  和 弱引用

    > <    输出重定向 和 输入重定向

    /      路径名目录分隔符

    ?      单个任意字符

    !      管道行逻辑 NOT

    变量的表达方式 $var 实际上是 ${var} 的简写形式,{}的形式好处如: ${10} ${Var}_ 以及可以进行下面的字符串高级操作

    2)字符串操作符

    字符串处理运算符允许你完成如下操作: 

    •  保证变量存在且有值
    • 设置变量的默认值
    • 捕获未设置变量而导致的错误
    • 删除匹配模式的变量的值部分内容

    替换运算符:
    ${varname:-word}    varname 存在且非null,返回varname , 否则返回word  (未定义返回默认值)
    ${varname:=word}     varname 存在且非null,返回varname , 否则返回word,并且将varname 置为word (未定义设置默认值)
    ${varname:?message}  varname 存在且非null,返回varname , 否则打印 message , 并退出当前脚本。
                  message 默认为parameter null or not set      (捕捉未定义而导致的错误)
    ${varname:+word}    varname 存在且非null,返回 word; 否则返回 null     (测试变量是否存在)

    模式匹配运算符:
    ${varname#pattern}    如果模式匹配变量值取值的 开头 处,则删除匹配的最 短 部分,并返回剩下部分
    ${varname##pattern}    如果模式匹配变量值取值的 开头 处,则删除匹配的最 长 部分,并返回剩下部分
    ${varname%pattern}     如果模式匹配变量值取值的 结尾 处,则删除匹配的最 短 部分,并返回剩下部分
    ${varname%%pattern}    如果模式匹配变量值取值的 结尾 处,则删除匹配的最 长 部分,并返回剩下部分
    ${varname/pattern/str}    替换第一个匹配的部分, 如果模式以#开头则匹配varname开头,%开头 则结尾
    ${varname//pattern/str}   替换所有匹配的部分
                    str 为空则删除匹配部分,varname 为@或* 则依次应用于每个参数并拓展为结果列表

     例子:line="arg=123"  : echo ${line%=*}   echo ${line#*=}

    位置变量

    $#    $?   $0    $*     分别表示传递给本脚本的 参数个数、上一条命令的返回值、第一个参数、所有参数

    shift :  Shell 内置命令,可以截去参数列表最左边一个

    #!/bin/bash
    # 依次读取打印文件
    while [ -e $1 ];
    do
        cat $1
        shift
    done
    shift.sh
    环境变量

    查看另一篇博文:变量基础  设置环境变量

    2、函数

    1)Shell 命令执行顺序

    交互Shell 在获取用户输入是,并不是直接在PATH 路径中查找,而是按照固定顺序依次寻找命令位置:

    • 别名    即使用alias command="..." 创建的命令
    • 关键字   如 if, for
    • 函数    当前声明的函数
    • 内置命令  如 cd,pwd
    • 外部命令      即脚本或可执行程序,这才在PATH路径中查找

    type 命令:可以查询命令的类型

    2) 函数的使用规则

    函数使用时,应遵守一些重要规则:

    • 函数必须先定义,后使用
    • 函数在当前环境运行,共享调用它的脚本中的变量,函数可以接收位置参数,局部变量使用local限定
    • exit 退出整个脚本, return 返回调用处,返回值为最后一条命令的退出状态
    • 内置命令 export -f 可以将函数导出到子Shell中
    • 如果函数保存在其他文件中,可以使用source 或dot 将它们装入当前脚本中
    • 函数可以递归调用,并且没有调用限制
    • declare -f 可以找到登录会话中定义的函数,按字母打印(很多,more less 辅助阅读)-F 则仅看函数名。

    3)若想每次启动系统是自动加载函数,只需要将函数写入启动文件中。例如,$HOME/.profile   ,则source $HOME/.profile 会自动加载函数。

    4)定义和删除函数

    function functionname ()   # 这种情况,()不是必须的
    { Shell commands}
    functionname () 
    { Shell commands}

    删除函数:

    unset -f functionname
    ~:cat add.sh
    #! /bin/bash
    # 数字相加
    add ()
    {
       let "sum=$1+$2"
       return $sum
    }
    
    ~: source add.sh
    ~: add 3 5
    ~: echo $?
    8
    演示函数的返回值
    3、条件语句
    语句结构

    if/else 语法结构如下:

    if condition
    then
    statments
    [elif condition
    then statement ...]
    [else
    statements]
    fi

    这里的condition不是一般的布尔表达式,而是语句列表,语句有各种退出状态。

    POSIX 定义的退出状态的含义

    退出状态值与对应的含义
    0 命令成功退出
    >0 在重定向或单词展开期间(~、变量、命令、算数展开、单词切割)失败
    1~125 命令退出失败。特定退出值的定义,参见不同命令的定义
    126 命令找到,但无法执行
    127 命令无法找到
    >128 命令因收到信号而死亡

     退出的状态可以进行逻辑操作:

    if ! condition
    then
    statement
    fi
    if condition1 && condition2
    then
        statement
    fi 
    if condition1 || condition2
    then 
        statement
    fi
    条件测试

    1) if 语句 使用test

      if 语句唯一可以测试的内容是退出状态。不能用于检测表达式的值。但是通过test命令,可以将表达式值的测试与if语句连用

    if test "2>3"
    then 
    ... 
    fi

    等价于:

    if [ "2>3" ]          # 注意:这里[后的空格,和]前的空格是必须要加的
    then
        ...
    fi

    test "" 或 [ "" ] 返回值:0 表示expression 参数为true, 1 表示expression参数为false 或丢失, >1 发生错误

    2) 字符串比较 (使用test)

     字符串操作符及其含义

    操作符 如果...则为真
    str1 = str2 str1 匹配 str2
    str1 != str2 str1 不匹配 str2
    str1 /< str2 str1 小于 str2
    str2 /> str2 str1 大于 str2
    -n str1 str1 为非null (长度大于0)
    -z str1 str1 为null (长度为0)

    shell 默认所有的变量都为字符串,如果要当成数字来处理,则比较符号为: -eq -gt -lt

    3) 文件属性的检查(使用test)

    操作符 如果...则为真
    -b file  file 为块设备文件
    -c file  file 为字符设备文件
    -d file  file 为目录
    -e file file 存在 
    -f file  file 为一般文件
    -g file  file 有设置它的setgid位
    -h file file 为符号连接
    -L file  同 -h
    -p file  file 为管道
    -r file  file 可读
    -S file  file 为套接字(socket)
    -s file  file 非空
    -u file  file 有设置它的setuid位
    -w file file 可写
    -x file fil可执行,如果是目录,则file可被查找
    -O file 你是file的所有者
    -G file file 的组ID匹配你的ID
    file -nt file2 file1 比file2 新
    file1 -ot file2 file1 比file2 旧

    4)case 语句

    case expression in
    pattern1)
            statements;;
    pattern2 | pattern3) 
            statements;;
    esac;
    4、循环语句
    for name [in list]
    do 
    ....
    done

    例子:

    for file in *.mp3
    do 
        mpg123 $file
    done
    遍历当前目录一级目录文件
    for file in `find . -iname *.mp3`    
    do 
        mpg123 $file
    done
    遍历当前目录下所有文件

    关于getopt 的例子:点这里

     while/until 循环:

    while condition  #condition 为真时继续
    do
    statements
    done
    until condition  #condition 为假时继续
    do
    statements
    done

    循环支持,break 和 continue ,如果嵌套循环,还可以在后面加上层数来控制跳出:

    while condition  1
    do
    while condition  2
    do
    break 2
    done
    done
  • 相关阅读:
    发张照片纪念下
    以用户为中心的SNS站点数据库设计及实现
    IT点评:腾讯帝国没落的开始从崇敬到平淡,改变从自己开始
    并发下常见的加锁及锁的PHP具体实现
    Ubuntu,Your Linux
    Python初尝试
    C++ Primer Plus读书笔记02
    C++ Primer Plus读书笔记03
    Effective C++读书笔记02
    由扔骰子看平均概率生成
  • 原文地址:https://www.cnblogs.com/BensonLaur/p/6075977.html
Copyright © 2011-2022 走看看