• Shell


    Shell

       Shell是一个命令解析器,是介于操作系统Kernel与用户之间的一个绝缘层,准确的说,它也是一种强力的计算机语言。一个shell程序也被成为一个脚本,是一种很容易使用的工具。

    编程基础:

      一、特殊字符

      #      命令行注释,“#”表示后面跟着的是注释,#!是个例外

    (1)注释可以位于行首,      如:#this is an annotation.

    (2)注释也可以位于本行命令的后边,如:This is a command. #annotation.

      ;     命令分隔符,可以用来在一行中来写多个命令。像C程序中“;”的用法。

    跟C程序一样,用分号表示一个命令输入的结束。    如:echo hello;echo "use ; !"

      .  字符匹配。这是正则表达式的一部分,用来匹配任何的单个字符。

      “”  部分引用,“STRING”阻止了一部分特殊字符。后面再详细分析。

      ''  全引用,’STRING‘阻止了全部特殊字符。后面详细分析。

      ,  逗号链接了一系列的算术操作,虽然里边的所有内容都被运行了,但只有最后一项被返回。跟C程序的用法一样。

        转义字符。

      /  Linux文件名路径分隔符,或用来最除号。

      ·  后置引用。tab上面的那个。

      !  取反操作符。

      *   乘法符号或正则表达式中的万能匹配字符。

      ** 幂运算符

      ?  正则表达式中匹配一个或没有的字符。

      $  变量替换。在正则表达式的结束标志符。

      常用的就是上面几种。

     

      二、变量和参数

      1、变量替换。“$”  变量替换操作符。

    强烈注意:在赋值的前后一定不能出现空格。

      2、赋值。

    这里重要要分清:部分引用 “” 、全部引用 ’‘ 、反引号 ·· 的作用。

    例子解说变量赋值和替换

    例子一

    #!/bin/bash
    a=123
    hello=${a}
    echo hello                  #输出字符串hello
    echo $hello                #输出 123
    echo ${hello}                  #输出 123 {}相当于C语言的()的用法 为了表达式的严谨,最好在$后面跟上{}
    echo "$hello"                 #输出 123
    echo "${hello}"                 #输出 123

    hello="A B C D"
    echo ${hello}                #输出 A B C D
    echo "${hello}"                 #输出 A B C D 加上部分引用符 “” 能把字符串按原来的格式输出 所以为了程序的严谨,echo后输出的字符串要加“”

    echo '${hello}'              #在全引号 ‘’ 中,什么元字符都是普通的字符。

    uninitialized_variable=23          #赋值
    unset uninitialized_variable ;       #unset it. 设置变量根本没赋值,为空。
    echo "uninitialized_variable = ${uninitialized_variable}"
                         #输出uninitialized_variable =
    let "uninitialized_variable += 5"
    echo "${uninitialized_variable}"     #对于一个unset的值就相当于0.

    例子二

    #!/bin/bash

    a=23
    echo $a                    #输出 23
    b=$a
    echo $b                   #输出 23

    a='echo Hello!'                 #单引号
    echo $a                    #输出 $a

    a=`ls`                    #反引号
    #echo $a                 #这么引用的话有可能ls的结果中所有的空白部分都没了,包括换行。也有可能全部竖着输出
    echo "$a"                 #正常,跟命令敲入ls的结果一样。

      3、bash变量不区分类型

      bash变量不像其他程序语言,bash不对变量区分“类型”。本质上,bash的变量全都是字符串。

    但依赖于上下文,bash也允许比较操作和算术操作,决定这些的关键因素就是要看变量中的值是否只有数字。

    用例子来查看Bash上变量是数值还是字符串。  

    #!/bin/bash
    #整形还是字符串
    a=12345
    let "a += 11" #整形处理
    echo "a = ${a}" #输出:12356

    b=${a/235/ABC} #将2替换成A,把b变量成整形变成了string
    echo "b = $b" #输出:1ABC6
    declare -i b #使用declare也没有用
    echo "b = $b"
    let "b += 1" #报错,let: 1ABC6: value too great for base (error token is "1ABC6")
    echo "b = ${b}"

    c=${b/ABC/235} #将STRING转换为整形。
    echo "c = ${c}"
    let "c += 1"
    echo "c = ${c}" #输出:12357

    #关于空变量
    d=""
    echo "d = $d" #输出d =
    let "d += 1"
    echo "d = ${d}" #输出d = 1

    #关于为声明的变量
    echo "e = ${e}" #输出 e =
    let "e += 1"
    echo "e = ${e}" #输出 e = 1

     结论:Bash中所有的变量都是STRING。

    三、Tests

    1、if/then结构可以测试命令的返回值是否为0(0表示成功),如果是的话,执行更多命令。

    #!/bin/bash
    #判断什么时候false为true
    if [[ "false" ]]
    then
    echo "false is true."
    else
    echo "false is false."
    fi            #输出:false is true.
    if [[ "$false" ]]
    then
    echo "false is true."
    else
    echo "false is false."
    fi            #输出:false is false.

    对于shell的if判断而言,判断的只是返回的状态。

    2、文件测试操作。

    -e 文件存在

    -a 文件存在,这个选项的效果和-e相同,但是它已经被弃用。

    -f file只是一个regular文件,不是目录或者设备文件。

    -s 文件长度不为零

    -d 文件是个目录

    -b 文件是个块设备,软盘,cdrom等等。

    -c 文件是个字符设备,键盘,modem,声卡等。

    -p 文件是个管道

    -h 文件是个符号链接

    -L 文件是个符号链接

    -S 文件是个SOCKET

    -t 关联到一个终端设备的文件描述符

    -r 文件具有读权限

    -w 文件具有写权限

    -x 文件具有执行权限

    -N 从文件最后被阅读到现在是否被修改

    f1 -nt f2  文件f1比f2新

    f1 -ot f2  文件f1比f2老

    f1 -ef f2  f1和f2都硬链接到同一个文件

    3、其他比较操作

    整数比较

    -eq  等于,如:if [  "$a" -eq "$b" ]

    -ne  不等于,如:if [  "$a" -ne "$b" ]

    -gt  大于,如:if [  "$a" -gt "$b" ]

    -ge   大于等于,如:if [  "$a" -ge "$b" ]

    -lt   小于,如:if [  "$a" -lt "$b" ]

    -le   小于等于,如:if [  "$a" -le "$b" ]

    <    小于,需要双括号,如: 

    <=

    >

    >=

  • 相关阅读:
    handler bundle message
    php xampp xdebug phpstorm调试
    centos 5.5 安装 KVM
    结构体数组 and 结构体数组大小的内存
    char * char [ ] char string
    val text html
    PHP
    黑马程序员——java学习16(张孝祥)——反射
    黑马程序员——java学习15(毕25)——正则表达式
    黑马程序员——java学习14(毕23-24)——网络编程
  • 原文地址:https://www.cnblogs.com/King-Penguin/p/5374730.html
Copyright © 2020-2023  润新知