zoukankan      html  css  js  c++  java
  • Bash语法


    关于Bash-Script的语法,包括函数...

    1. 函数

    函数需要在使用之前定义;同时,函数支持以文件的形式进行模块化封装,其他文件的调用范式如下:

    source base_func.sh
    myFunc  # 模块函数调用
    

    1.1. 无参函数

    常见的Bash函数,有两种书写方式

    function myfunc {
        echo "abc"
    }
    function myfunc2(){
        echo "ABC"
    }
    

    注意:函数名后需要有一个空格!

    1.2. 函数返回值

    1.2.1. 方法1【弃用】

    通过return关键字处理返回信息,主函数通过$?得到返回值:

    function myfunc {
        read -p "Enter a value: " value
        # let value2=$value*2
        # echo "Double $value = $value2"
        return $[ $value * 2 ]
    }
    myfunc
    echo "Get the function return-value: $?"  # 通过$?获取函数返回值
    

    以下方式无法得到正确的返回值,请谨慎操作:

    ret=`myfunc`  # 尝试获得myfunc函数的打印消息
    echo "Fail to get the return-value, but None: [$ret]"
    

    该方法是通过$?获取返回值,然而,return关键字只能返回number类型,且退出状态的取值范围是0到255,所以return方式的返回值严格受限。一般来说,return只是用于表示退出状态,而不作为返回值使用。

    1.2.2. 方法2【推荐】

    通过echo返回字符串,并利用$(function)捕获函数返回值:

    function help {
    param=$1  # 外部传参
        # echo "Usage : link-bin Target_Path Bin_FileName"  # 不应该有多个echo
        ret="echo string as return【$param】"    # 通过echo标准输出返回值
        echo $ret
    }
    echo_get=$(help param_abc)    # 通过$()调用执行函数并接收返回
    echo "Get the function echo_get: $echo_get"
    

    该方法是捕获函数内所有的echo语句作为return-value,比之方法1,返回值为字符串格式,范围不再受限。但函数如果需要返回,则需要人为地限制函数体内echo语句的使用(以及其他stdout输出),否则会干扰函数的返回值正确性。

    1.3. 含参函数

    编写形式,如上示例。

    需要注意变量在函数体内外的作用域变化:

    param="Null"
    function varfield {
        local param="abc"
        # param="123"  # 改写Outer-param的值
        echo "In the function: param=[$param]"
    }
    varfield
    echo "Out of function: param=[$param]"
    

    1.4. 关于数组做实参、数组作返回值

    array=(5 4 3 2 1)
    echo "The original array is: ${array[*]}"
    function array_add {
    local param_array=$*
        local array_new
        local index=0
        for value in ${param_array[*]}; do
            # echo "list[$index] = $value"
            param_array[$index]=$[ $value*2 ]  # 改写原数组
            let index+=1
            array_new+="$[ $value*2 ] "  # 利用字符串组装数组
        done
        # echo ${param_array[*]}
        echo $array_new  # 或者通过组装新的字符串来表示数组
    }
    array_ret=`array_add ${array[*]}`
    echo "Get return array: ${array_ret[*]}"
    index=0
    for value in ${array_ret[*]}; do
        echo "list[$index]=$value"
        let index+=1
    done
    

    尽管bash-script提供了数组的专有形式,但使用上与带空格的字符串没有太大的差别。实际上,实参尚可以数组格式传入(当然也可以先整合为字符串),但返回值只能利用echo,返回字符串格式的“数组”了。

    2. 条件判断

    以 FILE 为判断依据:

    以 STRING 为判断依据

    以 INTERGER 为判断依据

    2.1. 对比 [[ ]][ ] 的使用差别

    [[ ]] 是 [ ] 的一个增强版本,是一个关键字。但它仅适用于 bash、zsh 等脚本环境。[[ ]] 基本兼容了 [ ] 的全部功能,另外有一些优化和增强功能,具体如下:

    另,[[ ]] 增加了对多条件判断的支持:

    if [ expression1 ] && [ expression2 ]; then ...
    if [[ expression1 && expression2 ]]; then...
    

    2.2. 案例分析

    当执行以下代码时,无法准确得到期望的判断内容:

    function test_empty_string(){
        test -n $1 && echo 'not null' || echo 'null string'
    }
    test_empty_string ""  # return "not null"
    

    总会得到 not null 的结果,无论调用函数时传入什么参数(包括空字符串)。

    修改方法:将 test 语句改为: test -n "$1",就差了一个双引号,导致test检测失败。

    所以,如果需要进行条件判断,优先使用 [[ ]] 形式,而不是显式调用 test 关键字。

  • 相关阅读:
    To select the file to upload we can use the standard HTML input control of type
    Cascading Menu Script using Javascript Explained
    网站首页head区代码规范
    轻松掌握 Java 泛型
    JDK 5.0 中的泛型类型学习
    如何在firefox下获取下列框选中option的text
    是同步方法还是 synchronized 代码? 详解多线程同步规则
    javascript select option对象总结
    Select的动态取值(Text,value),添加,删除。兼容IE,FireFox
    javascript在ie和firefox下的一些差异
  • 原文地址:https://www.cnblogs.com/brt2/p/14381969.html
Copyright © 2011-2022 走看看