zoukankan      html  css  js  c++  java
  • Linux Bash Shell快速入门 (二)

    BASH 中的变量介绍
    BASH 中的变量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格。

    简单变量
    在 BASH 中变量定义是不需要的,没有 "int i" 这样的定义过程。
    如果想用一个变量,只要他没有在前面被定义过,就直接可以用,
    当然你使用该变量的第一条语句应该是对他赋初值了,
    如果你不赋初值也没关系,只不过该变量是空( 注意:是 NULL,不是 0 )。
    不给变量赋初值虽然语法上不反对,但不是一个好的编程习惯。

    好了我们看看下面的例子:
    首先用 vi 编辑下面这个文件 hello2:
    #!/bin/bash
    # give the initialize value to STR
    STR="Hello World"
    echo $STR

    在上面这个程序中我们需要注意下面几点:
    一,变量赋值时,'='左右两边都不能有空格;
    二,BASH 中的语句结尾不需要分号(";");
    三,除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加"$"符号,
    将上面程序中第三行改为 "echo STR" 再试试,看看会出什么结果。==>output: STR
    四,由于BASH 程序是在一个新的进程中运行的,
    所以该程序中的变量定义和赋值不会改变其他进程或原始 Shell 中同名变量的值,也不会影响他们的运行。
    更细致的文档甚至提到以但引号括起来的变量将不被 BASH 解释为变量,如 '$STR' ,而被看成为纯粹的字符串。
    而且更为标准的变量引用方式是 ${STR} 这样的,$STR 自不过是对 ${STR} 的一种简化。
    在复杂情况下(即有可能产生歧义的地方)最好用带 {} 的表示方式。

    BASH中的变量既然不需要定义,也就没有类型一说,一个变量即可以被定义为一个字符串,也可以被再定义为整数。
    如果对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。
    请看下面的例子:
    #!/bin/bash
    x=1999
    let "x = $x + 1"
    echo $x
    x="olympic'"$x
    echo $x

    关于整数变量计算,有如下几种:" + - * / % ",他们的意思和字面意思相同。
    整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x = $x + 1" 或者 x=`expr $x + 1`
    在比较操作上,整数变量和字符串变量各不相同,
    详见下表:
    对应的操作    整数操作    字符串操作
    相同       -eq                    =
    不同       -ne                   !=
    大于       -gt                     >
    小于       -lt                    <
    大于或等于    -ge    
    小于或等于    -le    
    为空        -z
    不为空        -n

    比如:
    比较字符串 a 和 b 是否相等就写作:if [ $a = $b ]
    判断字符串 a 是否为空就写作: if [ -z $a ]
    判断整数变量 a 是否大于 b 就写作:if [ $a -gt $b ]
    更细致的文档推荐在字符串比较时尽量不要使用 -n ,而用 ! -z 来代替。(其中符号 "!" 表示求反操作)
    BASH 中的变量除了用于对 整数 和 字符串 进行操作以外,另一个作用是作为文件变量。BASH 是 Linux 操作系统的 Shell,因此系统的文件必然是 BASH 需要操作的重要对象,如 if [ -x /root ] 可以用于判断 /root 目录是否可以被当前用户进入。
    下表列出了 BASH 中用于判断文件属性的操作符:
    运算符    含义( 满足下面要求时返回 TRUE )
    -e file    文件 file 已经存在
    -f file    文件 file 是普通文件
    -s file    文件 file 大小不为零
    -d file    文件 file 是一个目录
    -r file    文件 file 对当前用户可以读取
    -w file    文件 file 对当前用户可以写入
    -x file    文件 file 对当前用户可以执行
    -g file    文件 file 的 GID 标志被设置
    -u file    文件 file 的 UID 标志被设置
    -O file    文件 file 是属于当前用户的
    -G file    文件 file 的组 ID 和当前用户相同
    file1 -nt file2    文件 file1 比 file2 更新
    file1 -ot file2    文件 file1 比 file2 更老

    注意:上表中的 file 及 file1、file2 都是指某个文件或目录的路径。

    关于局部变量
    在 BASH 程序中如果一个变量被使用了,那么直到该程序的结尾,该变量都一直有效。
    为了使得某个变量存在于一个局部程序块中,就引入了局部变量的概念。
    BASH 中,在变量首次被赋初值时加上 local 关键字就可以声明一个局部变量,如下面这个例子:
    #!/bin/bash
    HELLO=Hello
    function hello {
    local HELLO=World
    echo $HELLO
    }
    echo $HELLO
    hello
    echo $HELLO
    该程序的执行结果是:
    Hello
    World
    Hello
    这个执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。也就是说局部变量 $HELLO 的影响只存在于函数那个程序块中。


    BASH 中的变量与 C 语言中变量的区别
    这里我们为原来不熟悉 BASH 编程,但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题。
    1,BASH 中的变量在引用时都需要在变量前加上 "$" 符号(第一次赋值及在For循环的头部不用加 "$"符号);
    2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用;
    3,BASH 中的整形变量的比较符号与 C 语言中完全不同,而且整形变量的算术运算也需要经过 let 或 expr 语句来处理;

    BASH 中的基本流程控制语法
    BASH 中几乎含有 C 语言中常用的所有控制结构,如条件分支、循环等,下面逐一介绍。
    2.4.1 if...then...else
    if 语句用于判断和分支,其语法规则和 C 语言的 if 非常相似。其几种基本结构为:
    if [ expression ]
    then
    statments
    fi
    或者
    if [ expression ]
    then
    statments
    else
    statments
    fi
    或者
    if [ expression ]
    then
    statments
    else if [ expression ]
    then
    statments
    else
    statments
    fi
    或者
    if [ expression ]
    then
    statments
    elif [ expression ]
    then
    statments
    else
    statments
    fi
    值得说明的是如果你将 if 和 then 简洁的写在一行里面,就必须在 then 前面加上分号,
    如:if [ expression ]; then ... 。下面这个例子说明了如何使用 if 条件判断语句:
    #!/bin/bash

    if [ $1 -gt 90 ]
    then
    echo "Good, $1"
    elif [ $1 -gt 70 ]
    then
    echo "OK, $1"
    else
    echo "Bad, $1"
    fi

    exit 0
    上面例子中的 $1 是指命令行的第一个参数,这个会在后面的“BASH 中的特殊保留字”中讲解。

    备注:随笔中内容来源于网上资料整理,仅供参考。

  • 相关阅读:
    CA认证
    浅谈个人融资秘诀
    外挂编写完全攻略
    字符串之单词原地逆转
    推荐系统(1)--splitting approaches for context-aware recommendation
    BZOJ 1122 POI2008 账本BBB 单调队列
    一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)
    几种内存数据的总结
    Android学习路线(十九)支持不同设备——支持不同(Android)平台版本号
    毕业课题之------------图像的形态学滤波
  • 原文地址:https://www.cnblogs.com/Alanf/p/7838858.html
Copyright © 2011-2022 走看看