什么是变量?
变量最初来源于数学,指的是非固定的值可变化的数通常用拉丁字母表示。在计算机中变量它依旧指的是可变化的数,只不过表现形式有些变化。它指的是变量名+所指向的内存空间。
以下实验环境均在CentOS7.2进行
变量的特点
变量分强类型变量,与弱类型变量
强类型变量:变量需事先声明且需提前定义其变量存储格式
弱类型变量:不需事先声明,不需定义变量存储格式。
bash把所有变量统统视作字符型;bash中的变量无需事先声明,相当于,把声明和赋值过程同时实现。
变量名的命名规范:
变量名只能包含数字,字母和下划线,而且不能以数字开头。
其命名要求见名知义,命名机制遵循某种法则(驼峰法则);不能使用程序的保留字:if,else,then,while,for...
bash的变量类型及其使用格式
本地变量,环境变量,局部变量,位置参数变量,特殊变量
变量引用格式:$VAR、${VAR}
………………………………………………………………………………………………………………………
本地变量:作用域仅为当前shell进程
变量赋值:name=‘value’
value有如下引用类型
1、直接字符串引用,格式:name="CHARS"
[[email protected] ~]# name1=abc [[email protected] ~]# echo $name1 abc
2、变量引用,格式:name=“$VAR”
[[email protected] ~]# name2=$SHELL [[email protected] ~]# echo $name2 /bin/bash
3、命令引用,格式:name=`COMMAND` | name=$(COMMAND)
[[email protected] ~]# name3=`date` [[email protected] ~]# echo $name3 2016年 08月 14日 星期日 11:16:55 CST [[email protected] ~]# name3=$(date) [[email protected] ~]# echo $name3 2016年 08月 14日 星期日 11:17:11 CST
“”:弱引用,其中的变量引用会被替换为变量值;
[[email protected] ~]# name4="$name1" [[email protected] ~]# echo $name4 abc
‘’:强引用,其中的变量引用不会被替换为变量值,而保持原字符串;
[[email protected] ~]# name5=‘$name1‘ [[email protected] ~]# echo $name5 $name1
命令set用于显示已定义的所有变量
撤销已定义的变量,格式:unset 变量名
[[email protected] ~]# echo $name5 $name1 [[email protected] ~]# unset name5 [[email protected] ~]# echo $name5 [[email protected] ~]#
注:在刚接触bash变量时特别容易搞错的就是变量的使用格式,有时候该命令引用却忘记加``或$(),还有就是强引用与弱引用的使用时机。
下面以例子说明本地变量的作用范围,使用命令bash进入子shell
[[email protected] ~]# bash [[email protected] ~]# echo $name1 [[email protected] ~]# exit exit [[email protected] ~]# echo $name1 abc
由实验可知,作用域仅为当前shell进程。当然上面实验做的不够完善,因为并没有演示在符父shell中其变量是否有效,大家可以在下面补充实验去验证。
………………………………………………………………………………………………………………………
环境变量:作用域为当前shell进程及子进程
变量赋值:
有四种赋值格式:
1、export name=value
2、name=value
export name
3、declare -x name=value
4、name=value
declare -x name
注:bash内嵌了许多环境变量(通常全为大写字符),用于定义bash的工作环境
查看/显示环境变量 命令
export
[[email protected] ~]# export | head -5 declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="centos7" declare -x LANG="zh_CN.UTF-8"
declare -x
[[email protected] ~]# export | head -5 declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="centos7" declare -x LANG="zh_CN.UTF-8"
printenv
[[email protected] ~]# printenv | head -5 XDG_SESSION_ID=8 HOSTNAME=centos7 SELINUX_ROLE_REQUESTED= TERM=linux SHELL=/bin/bash
env
[[email protected] ~]# printenv | head -5 XDG_SESSION_ID=8 HOSTNAME=centos7 SELINUX_ROLE_REQUESTED= TERM=linux SHELL=/bin/bash
上面四个命令虽然显示顺序略有不同但是所包含的内容都是一样的
[[email protected] ~]# env | wc -l 24 [[email protected] ~]# printenv | wc -l 24 [[email protected] ~]# export | wc -l 24 [[email protected] ~]# declare -x | wc -l 24
撤销环境变量
格式:unset VAR
下面通过例子验证环境变量的作用范围
[[email protected] ~]# export name6=$name2 [[email protected] ~]# echo $name6 /bin/bash [[email protected] ~]# bash [[email protected] ~]# echo $name6 /bin/bash
………………………………………………………………………………………………………………………
局部变量:作用域仅为某代码片段(通常用在函数)
因为函数还没学到,这里不举例子
………………………………………………………………………………………………………………………
位置变量:当执行脚本的shell进程传递的参数
$1,$2,...$(10)...:对应调用第1,第2...第10个参数
………………………………………………………………………………………………………………………
特殊变量:shell内置的特殊功用的变量
$#:传递给脚本参数的个数
$*:传递给脚本的所有参数;各参数读成多个独立字符串
[email protected]:传递给脚本的所有参数;各参数读成一个完整的字符串形式
$?:程序执行状态返回值,0表示正确,1-255表示失败
$0:表示命令本身
下面以一个简单的脚本来给出位置变量与特殊变量的应用
[[email protected] test]# cat var1.sh #!/bin/bash # echo "$1" echo "$2" echo "$#" echo "[email protected]" echo "$*"
上面特殊变量及位置变量均需要结合脚本才能使用。[email protected],$*二者虽然有区别不过在初学时可以
不必在意,当学到一定阶段接触了一定的脚本后自然也就会区分二者的不同了。
算术运算
在未学习bash中的算术运算之前如果要计算从1+...+10需要使用管道将其送入bc计算器来解决,
echo {1..10} | tr ‘ ‘ ‘+‘| bc很麻烦。而使用bash中的算术运算则可以简化代码。
bash中的算术运算格式:有很多种,本文只介绍常用的4种
1)let VAR=算术运算表达式
[[email protected] test]# let sum1=1+10 [[email protected] test]# echo $sum1 11
2)VAR=$[算术表达式]
[[email protected] test]# sum2=$[2+2] [[email protected] test]# echo $sum2 4
3)VAR=$((算术表达式))
[[email protected] test]# sum3=$((5+5)) [[email protected] test]# echo $sum3 10
4)VAR=$(expr $ARG $OP $ARG2)
[[email protected] ~]# sum4=$(expr 2+8) [[email protected] ~]# echo $sum4 2+8 [[email protected] ~]# sum4=$(expr 2 + 8 ) [[email protected] ~]# echo $sum4 10
这种是调用expr命令计算后面运算表达式,它要求数值与运算符之间有空格,没有空格则不进行计算,保持运算表达式原本模样赋值给变量。
注:它与上述三种不同之处还有如果有乘法运算,乘法符号*在第四种里面需要加\进行转义。
以下为四种算术运算在乘法中的表现
[[email protected] ~]# sum4=$(expr 2 * 8 ) expr: 语法错误 [[email protected] ~]# sum4=$(expr 2 \* 8 ) [[email protected] ~]# echo $sum4 16 [[email protected] ~]# let sum1=6*6 [[email protected] ~]# echo $sum1 36 [[email protected] ~]# sum2=$[2*3] [[email protected] ~]# echo $sum2 6 [[email protected] ~]# sum3=$((3*4)) [[email protected] ~]# echo $sum3 12
第四种需要转义,其他三种不需要。