zoukankan      html  css  js  c++  java
  • shell脚本之变量与运算符

    shell变量简介

    变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,shell变量也循环这个规则。

    在bash shell中,每一个变量的值都是字符串,无论你给变量赋值是有没有使用引导,值都会以字符串的形式储存。

    这意味着,bash shell在默认情况系不会区分变量类型,即使你将整数和小数赋值给变量,他们也会被视为字符串,这一点和大部分的编程语言不通。

    定义变量

    shell支持以下三种定义变量的方式

    variable=value
    variable='value'
    variable="value"

    variable是变量名,value是赋给变量的值。

    注意:赋值号的周围不能有空格,这与其它大部分编程语言不一样

    Shell 变量的命名规范和大部分编程语言都一样:

    • 变量名由数字、字母、下划线组成;
    • 必须以字母或者下划线开头;
    • 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

    使用变量

    使用一个定义过得变量,只要在变量名前加美元符号$即可

    author="ken"
    echo $author
    echo ${author}

    变量名外面的花括号{}是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

    例如

    skill="Java"
    echo "I am good at ${skill}Script"

    如果不是skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号{ },这是个良好的编程习惯。

    系统变量

    在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell 预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。一些写 Shell 脚本时常用的系统变量

    $SHELL 默认shell
    $HOME 当前用户家目录
    $IFS 内部字段分隔符
    $LANG 默认语言
    $PATH 默认可执行程序路径
    $PWD 当前目录
    $UID 当前用户ID
    $USER 当前用户
    $HISTSIZE 历史命令大小,可通过HISTTIMEFORMAT变量设置明命令执行时间
    $RANDOM 随机生成一个0到32767的整数
    $HOSTNAME 主机名

    普通变量定义:VAR=value

    临时环境变量定义:export VAR=value

    变量引用:$VAR

    区别:shell进程的环境变量作用域是shell进程,当export导入系统变量时,则作用域是shell进程机器shell子进程,另开shell无效

    修改变量的值

    已定义的变量,可以重新赋值

    url="http://www.baidu.com"
    echo ${url}
    url="http://www.sina.com"
    echo ${url}

    第二次对变量赋值时不能再变量前加$,只有在使用变量时才能加$

    单引号、双引号、反引号

    单引号:所见即所得

    双引号:解析变量和命令

    反引号:执行命令。与$()作用相同

    删除变量

    使用unset命令可以删除变量

    unset variable_name

    变量删除后不能再次使用,unset命令不能删除只读变量

    [root@ken ~]# name=ken
    [root@ken ~]# readonly name
    [root@ken ~]# echo $name
    ken
    [root@ken ~]# unset name
    -bash: unset: name: cannot unset: readonly variable

    变量类型

    ①局部变量:局部变量在脚本或者命令中定义,尽在当前shell实例中有效,其它shell启动的程序不能访问局部变量

    ②环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量

    ③shell变量:shell变量是由shell程序设置的特殊变量shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    特殊变量列表(shell变量)

    变量 含义
    $0 当前脚本的文件名
    $n 传递给脚本或者函数的参数,n是一个数字,表示第几个参数
    $# 传递给脚本或者函数的参数个数
    $* 传递给脚本或函数的所有参数
    $? 上个命令的退出状态,或者函数的返回值
    $$

    当前shell进程ID。对于shell脚本,就是这些脚本所在的进程ID

    退出状态

    $?可以获取上一个命令的退出状态,所谓的退出状态,就是上一个命令执行后的返回结果

    退出状态是一个数字,一般情况系,大部分命令执行成功会返回0,失败会返回1

    不过,也会有一些命令返回其他值,表示不同类型的错误

    条件表达式

    表达式 实例
    [ expression ] [ 1 -eq 1 ]
    [[ expression ]] [[ 1 -eq 1 ]]
    test expression test 1 -eq 1 ,等同于[]

    注意:括号中的表达式前后都要有空格,否则会报错

    整数比较符

    比较符 描述 实例
    -eq  equal 等于 [ 1 -eq 1 ] 为true
    -ne  not equal 不等于 [ 1 -ne 1 ] 为false
    -gt  greate than 大于 [ 1 -gt 1 ] 为false
    -lt  lesser than 小于 [ 1 -lt 1 ] 为false
    -ge  greate or equal 大于或者等于 [ 1 -ge 1 ] 为true
    -le  lesser or equal 小于或者等于 [ 1 -le 1 ] 为true

    字符串比较符

    运算符 描述 实例
    == 等于 [ "a" == "a" ] 为true
    != 不等于 [ "a" != "a" ] 为false
    -n 字符串长度不等于0为真

    VAR1=1;VAR2=""

    [ -n "$VAR1" ]为 true

    [ -n "$VAR2" ]为 false

    -z 字符串长度等于0为真 VAR1=1;VAR2=""

    [ -z "$VAR1" ]为false

    [ -z "$VAR2" ]为 true

    文件测试

       测试符      

                 描述                                  实例                

                -e

    文件或者目录存在为真

    [ -e path ] path 存在为 true

                -f

    文件存在为真

    [ -f file_path ] 文件存在为 true

                -d

    目录存在为真

    [ -d dir_path ] 目录存在为 true

                 -r

    有读权限为真 [ -r file_path ]file_path有读权限为真

                -w

    有写权限为真 [ -r file_path ]file_path有写权限为真

                -x

    有执行权限为真 [ -r file_path ]file_path有执行权限为真

    布尔运算符

            运算符              

                  描述                               实例                     

                 !

    非关系,条件结果取反

    [  ! 1 -eq 2 ]为true

                 -a

    和关系,在[]表达式中使用

    [ 1 -eq 1 -a 2 -eq 2 ]为true

    两者都为真才为真

                 -o

    或关系,在[]表达式中使用

    [ 1 -eq 1 -o 2 -eq 1 ]为true

    两者有一真则为真

    逻辑判断符

         判断符                             描述          

                     实例              

                         &&

     逻辑和,在[[]]表达式中

    或判断表达式是否为真时使用

    [[ 1 -eq 1 && 2 -eq 2 ]]为 true

    [ 1 -eq 1 ] && echo 'true',如果&&前面的

    表达式为true则执行后面的

                         ||

    逻辑或,在[[]]表达式中

    或判断表达式是否为真时使用

    [[ 1 -eq 1 || 2 -eq 1 ]]为 true

    [ 1 -eq 2 ] || echo 'true',如果||前面的

    表达式为false则执行后面的

     注意:[] 不支持以上两个逻辑判断符,应该使用布尔运算符

    整数运算

      运算符         

                描述                 

             +

               加法

              -

               减法

              *

               乘法

              /

               除法

              %

               取余

     运算表达式          

                实例                  

                     $(())

              $((1+1))

                     $[]

               $[]

    其他运算工具

      命令        

               描述                      

                      实例              
                       let

            赋值并运算,支持++、--

    let VAR=(1+2)*3 ; echo $VAR

    x=10 ; y=5

    let x++;echo $x 每执行一次 x 加 1

    let y--;echo $y 每执行一次 y 减 1

    let x+=2 每执行一次 x 加 2

    let x-=2 每执行一次 x 减 2

                    expr

      乘法*需要加反斜杠转义*

     

    expr 1 * 2   运算符两边必须有空格

    expr ( 1 + 2 ) * 2  使用双括号时要转义

                      bc

     计算器,支持浮点运算、平方等

     bc 本身就是一个计算器,可直接输入命令,进入解释器

    echo 1 + 2 |bc 将管道符前面标准输出作为 bc 的标准输入

    echo "1.2+2" |bc

     

    shell括号用法总结

    ()

    用途1:在运算中,先计算小括号里面的内容

    用途2:数组

    用途3:匹配分组

    (())

    用途1:表达式,不支持-eq这类的运算符。不支持-a和-o,支持<=、>=、>这类比较符和&&、||

    $() 执行shell命令。与反引号等效
    $(())

    用途1:简单算术运算

    用途2:支持三目运算符  例:$(( 表达式?数字:数字 ))

    [] 条件表达式,里面不支持逻辑判断符
    [[]] 条件表达式,里边不支持-a和-o,不支持<=、>=比较符,但支持-eq、<、>这类比较符
    $[] 简单算术运算
    {} 对逗号(,)和点点(...)起作用,比如touch {1..3}或者{1,2,3}
    ${}

    用途1:引用变量

    用途2:字符串处理

     

     

     

     

     

  • 相关阅读:
    程序员的健康问题
    比特币解密
    浅谈比特币
    一款能帮助程序员发现问题的软件
    微软为什么总招人黑?
    写了一个bug,最后却变成了feature,要不要修呢?
    不管你信不信,反正我信了
    Excel工作表密码保护的破解
    pip笔记(译)
    super
  • 原文地址:https://www.cnblogs.com/it-ljm1903/p/10860291.html
Copyright © 2011-2022 走看看