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:字符串处理

 

 

 

 

 

posted on 2019-05-14 08:59  怪人plus  阅读(277)  评论(0编辑  收藏  举报

导航