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

    The Bash shell is commonly used interactively: It lets you enter and edit commands, then executes them when you press the Return key.The Bash shell can also be run non-interactively from a script, making the shell require no human interaction.

    变量

    变量的初始化,Bash shell 在默认情况下不会区分变量类型,即使将整数和小数赋值给变量,它们也会视为字符串。

    变量的使用是通过美元符号$来引用的。例如

    #!/usr/bin/env bash
    
    author="tom"
    echo $author
    echo ${author}
    
    # 将命令的结果赋值给变量
    variable=$(command)
    
    echo ${variable}

    变量名外面的花括号是可选的,可加可不加,加上可以帮助解释器识别变量的边界。建议给所有变量加上花括号。

    在 shell 中定义的变量,默认就是全局变量。全局变量的作用范围是当前的 shell 进程,而不是当前 shell 脚本文件。

    在 shell 函数中定义的变量默认也是全局变量,如果想要将变量作用域仅限于函数内部,可在定义时加上 local 命令。

    全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。如果使用 export 命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为 环境变量。

    通过 export 导出的环境变量只对当前 Shell 进程以及所有的子进程有效,如果最顶层的父进程被关闭了,那么环境变量也就随之消失了,其它的进程也就无法使用了,所以说环境变量也是临时的。

    命令替换

    shell 命令替换是指将命令的输出结果赋值给某个变量。有两种方式完成命令替换,一是反引号 ` `,二是美元符号加括号 $()。

    variable=`commands`
    variable=$(commands)

    commands 是要执行的命令。commands 可以只有一个命令,也可以有多个命令,多个命令之间以分号 ; 分隔。

    $() 仅在 Bash shell 中有效,但支持嵌套。反引号` `可在多种shell中使用,但是不支持嵌套。

    参数

    通过 $n 的形式来接收参数,称为位置参数。

    给脚本文件传递位置参数

    echo "Language: $1"
    echo "URL: $2"

     给函数传递位置参数

    #定义函数
    function func(){
        echo "Language: $1"
        echo "URL: $2"
    }
    #调用函数
    func Java https://www.company.com

    shell 中有一些特殊变量:

    • $0 当前脚本的文件名
    • $# 传递给脚本或函数的参数个数
    • $* 传递给脚本或函数的所有参数
    • $@ 传递给脚本或函数的所有参数
    • $? 上个命令的退出状态,或者函数的返回值
    • $$ 当前 shell 进程 ID。对于 shell 脚本,就是这些脚本所在的进程 ID
    • $! 最后运行的后台Process的PID

    shell 中变量分为位置变量和特殊变量。

    数据类型

    shell 中基本数据类型有字符串和数字。

    字符串可以由单引号包围,也可以由双引号包围,也可以不用引号。

    获取字符串长度:${#str}。

    字符串拼接:在 shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接。

    name="Shell"
    url="http://c.biancheng.net/shell/"
    str1=$name$url  #中间不能有空格
    str2="$name $url"  #如果被双引号包围,那么中间可以有空格
    str3=$name": "$url  #中间可以出现别的字符串
    str4="$name: $url"  #这样写也可以
    str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号

    字符串的截取:从左边开始计数 ${string:start:length},从指定字符(子字符串)开始截取 ${string#*chars}

    shell 也支持数组,且没有限制数组的大小。shell 是弱类型,并不要求所有数组元素的类型必须相同。利用 @ 或 * 可以获取所有的元素。

    arr=(20 56 "hello")
    arr[0]=50
    echo ${arr[2]}
    echo ${arr[*]}

    用 unset 关键字来删除数组元素,用法 unset arr[index] 如果不写下标就是删除整个数组 unset arr

    通过 # 来获取数组元素的个数 ${#arr[@]} 或者 ${#arr[*]}

    数组拼接的写法 array_new=(${arry1[@]} ${arry2[@]})

    数学计算

    shell 和其他编程语言不同,shell 不能直接进行算数运算,必须使用数学计算命令。shell 中常用的数学计算命令如下:

    • (( )) 用于整数运算,效率很高,推荐使用
    • let 用于整数运算
    • $[ ] 用于整数运算
    • expr 用于整数运算,也可以处理字符串
    • bc 可以处理整数和小数,Linux下的一个计算器程序
    • declare -i 将变量定义为整数,仅支持最基本的数学运算(加减乘除和取余)

     双小括号 (( )) 的语法格式为:((表达式)) 表达式可以只有一个,也可以多个,多个表达式之间以逗号分隔。对于多个表达式,以最后一个表达式的值作为整个 (( )) 命令的执行结果。

    可以使用 $ 获取 (( )) 命令的结果,这和使用 $ 获得变量值是类似的。在 (( )) 中使用变量不需要加 $ 前缀,(( )) 会自动解析变量名。

    b=10
    ((a=b+5))
    echo ${a}
    
    d=$((b+6))
    echo ${d}

     let 命令语法格式为:let 表达式 或者 let "表达式" 或者 let '表达式' 它们都等价于 ((表达式)) 。

    选择结构

    最常用的 if 语句,语法格式为:

    if  condition
    then
        statement(s)
    fi

     也可以将 if 和 then 写在一行:

    if  condition;  then
        statement(s)
    fi

     多条件语句:

    if  condition1
    then
       statement1
    elif condition2
    then
        statement2
    elif condition3
    then
        statement3
    else
       statementn
    fi

    退出状态 exit statu 每一条 shell 命令,包括 Bash 内置命令、Linux 命令、自定义 shell 函数,当它退出(运行结束)时,都会返回一个比较小的整数值给调用(使用)它的程序,这个就是命令的退出状态。

    很多 Linux 命令其实就是一个 C 语言程序,main() 函数的最后都有一个 return 0,如果程序想在中间退出,还可以使用 exit 0,这其实就是 C 语言的退出状态。当有其他程序调用这个程序时,就可以捕获这个退出状态。

    if 语句的判断条件,从本质上讲,判断的就是命令的退出状态。

    按照惯例来说,推出状态0 表示成功,其它任何退出状态为失败。但是也有例外,例如 diff 命令。

    test 是 shell 内置命令,用来检测某个条件是否成立。test 命令用法为:test expression 也可以简写为 [ expresssion ]。

    与文件检测相关的 test 选项:

    • -e filename 判断文件是否存在

    与数值比较相关的 test 选项:

    • num1 -eq num2 判断 num1 是否和 num2 相等

    与字符串判断相关的 test 选项:

    • -z str 判断字符串 str 是否为空
    • -n str 判断字符串 str 是否为非空

    与逻辑运算相关的 test 选项:

    • expression1 -a expression2 逻辑与
    • expression2 -o expression2 逻辑或
    • !expression 逻辑非

    双中括号 [[ ]] 是 shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。用法是: [[ expression ]] 可以理解为是 test 的升级版。

    较多分支使用 case in 语句:

    case expression in
        pattern1)
            statement1
            ;;
        pattern2)
            statement2
            ;;
        pattern3)
            statement3
            ;;
        *)
            statementn
    esac

    循环结构

    while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。

    while condition
    do
        statements
    done

    Shell 脚本还提供了 for 循环,它更加灵活易用,更加简洁明了。Shell for 循环有两种使用形式。

    C 语言风格的 for 循环:

    for((exp1; exp2; exp3))
    do
        statements
    done

    Python 风格的 for in 循环:

    for variable in value_list
    do
        statements
    done

    注意,select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。

    echo "What is your favourite OS?"
    select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
    do
        echo $name
    done
    echo "You have selected $name"

    函数

    shell 函数定义的语法结构如下:

    function name() {
        statements
        return value
    }

    return 语句可写可不写。

    调用函数直接给出函数名即可:name;如果传递参数,那么多个参数之间以空格分隔:name param1 param2 param3

    注意调用函数时不需要带括号。

    补充

    variable=$(commands)  是指命令替换。

    variable=$((a+10)) 是指数学计算。 

    [ expression ] 是 test 的简写。

    [[ expression ]] 是 test 的升级版。

    参考:

    http://c.biancheng.net/shell/ 

  • 相关阅读:
    家庭作业 3.66
    存储器层次结构
    PHP empty()函数说明---用了N遍了就是记不住
    如何让mysql的自动递增的字段重新从1开始呢?(
    dirname(__FILE__) 的使用总结
    又回来了
    Ecshop 后台增加一个左侧列表菜单menu菜单的方法
    用PHP上传文件时$_FILES中error返回值详解
    ECSHOP站内页面跳转,避免死链
    比特币Bitcoin-qt客户端加密前后如何导入导出私钥?
  • 原文地址:https://www.cnblogs.com/colin220/p/10967316.html
Copyright © 2011-2022 走看看