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/ 

  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/colin220/p/10967316.html
Copyright © 2011-2022 走看看