Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

Linux基础知识之bash脚本编程初级-变量与算术运算

$
0
0
什么是变量? 变量最初来源于数学,指的是非固定的值可变化的数通常用拉丁字母表示。在计算机中变量它依旧指的是可变化的数,只不过表现形式有些变化。它指的是 变量名+所指向的内存空间 。

以下实验环境均在CentOS7.2进行

变量的特点 变量分强类型变量,与弱类型变量

强类型变量 :变量需事先声明且需提前定义其变量存储格式

弱类型变量 :不需事先声明,不需定义变量存储格式。

bash把所有 变量统统视作 字符型 ;bash中的变量无需事先声明,相当于,把声明和赋值过程同时实现。

变量名的命名规范 :

变量名只能包含 数字 , 字母 和 下划线 ,而且 不能以数字开头 。

其命名要求 见名知义 ,命名机制 遵循某种法则(驼峰法则) ; 不能使用程序的保留字 :if,else,then,while,for...

bash的变量类型及其使用格式

本地变量,环境变量,局部变量,位置参数变量,特殊变量

变量引用格式:$VAR、${VAR}

………………………………………………………………………………………………………………………

本地变量 :作用域仅为当前shell进程

变量赋值:name=‘value’

value有如下引用类型

1、直接字符串引用, 格式 : name="CHARS"

[root@centos7~]#name1=abc [root@centos7~]#echo$name1 abc

2、变量引用, 格式:name=“$VAR”

[root@centos7~]#name2=$SHELL [root@centos7~]#echo$name2 /bin/bash

3、命令引用, 格式:name=`COMMAND` | name=$(COMMAND)

[root@centos7~]#name3=`date` [root@centos7~]#echo$name3 2016年08月14日星期日11:16:55CST [root@centos7~]#name3=$(date) [root@centos7~]#echo$name3 2016年08月14日星期日11:17:11CST

“”:弱引用 ,其中的变量引用会被替换为变量值;

[root@centos7~]#name4="$name1" [root@centos7~]#echo$name4 abc

‘’:强引用 ,其中的变量引用不会被替换为变量值,而保持原字符串;

[root@centos7~]#name5='$name1' [root@centos7~]#echo$name5 $name1

命令set用于显示已定义的所有变量

撤销已定义的变量, 格式:unset 变量名
[root@centos7~]#echo$name5 $name1 [root@centos7~]#unsetname5 [root@centos7~]#echo$name5 [root@centos7~]#

注 : 在刚接触bash变量时特别容易搞错的就是变量的使用格式,有时候该命令引用却忘记加``或$(),还有就是强引用与弱引用的使用时机。

下面以例子说明本地变量的作用范围,使用命令bash进入子shell

[root@centos7~]#bash [root@centos7~]#echo$name1 [root@centos7~]#exit exit [root@centos7~]#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 [root@centos7~]#export|head-5 declare-xHISTCONTROL="ignoredups" declare-xHISTSIZE="1000" declare-xHOME="/root" declare-xHOSTNAME="centos7" declare-xLANG="zh_CN.UTF-8" declare -x [root@centos7~]#export|head-5 declare-xHISTCONTROL="ignoredups" declare-xHISTSIZE="1000" declare-xHOME="/root" declare-xHOSTNAME="centos7" declare-xLANG="zh_CN.UTF-8" printenv [root@centos7~]#printenv|head-5 XDG_SESSION_ID=8 HOSTNAME=centos7 SElinux_ROLE_REQUESTED= TERM=linux SHELL=/bin/bash env [root@centos7~]#printenv|head-5 XDG_SESSION_ID=8 HOSTNAME=centos7 SELINUX_ROLE_REQUESTED= TERM=linux SHELL=/bin/bash

上面四个命令虽然显示顺序略有不同但是所包含的内容都是一样的

[root@centos7~]#env|wc-l 24 [root@centos7~]#printenv|wc-l 24 [root@centos7~]#export|wc-l 24 [root@centos7~]#declare-x|wc-l 24

撤销环境变量

格式:unset VAR

下面通过例子验证环境变量的作用范围

[root@centos7~]#exportname6=$name2 [root@centos7~]#echo$name6 /bin/bash [root@centos7~]#bash [root@centos7~]#echo$name6 /bin/bash

………………………………………………………………………………………………………………………

局部变量 :作用域仅为某代码片段(通常用在函数)

因为函数还没学到,这里不举例子

………………………………………………………………………………………………………………………

位置变量 :当执行脚本的shell进程传递的参数

$1,$2,...$(10)...:对应调用第1,第2...第10个参数

………………………………………………………………………………………………………………………

特殊变量 :shell内置的特殊功用的变量

$#:传递给脚本参数的个数

$*:传递给脚本的所有参数; 各参数读成多个独立字符串

$@:传递给脚本的所有参数; 各参数读成一个完整的字符串形式

$?:程序执行状态返回值,0表示正确,1-255表示失败
$0:表示命令本身

下面以一个简单的脚本来给出位置变量与特殊变量的应用

[root@centos7test]#catvar1.sh #!/bin/bash # echo"$1" echo"$2" echo"$#" echo"$@" echo"$*"
Linux基础知识之bash脚本编程初级-变量与算术运算

上面特殊变量及位置变量均需要结合脚本才能使用。$@,$*二者虽然有区别不过在初学时可以 不必在意,当学到一定阶段接触了一定的脚本后自然也就会区分二者的不同了。

算术运算

在未学习bash中的算术运算之前如果要计算从1+...+10需要使用管道将其送入bc计算器来解决,

echo {1..10} | tr ' ' '+'| bc很麻烦。而使用bash中的算术运算则可以简化代码。

bash中的算术运算格式:有很多种,本文只介绍常用的 4种

1) let VAR=算术运算表达式

[root@centos7test]#letsum1=1+10 [root@centos7test]#echo$sum1 11 2) VAR=$[算术表达式] [root@centos7test]#sum2=$[2+2] [root@centos7test]#echo$sum2 4

3) VAR=$((算术表达式))

[root@centos7test]#sum3=$((5+5)) [root@centos7test]#echo$sum3 10

4) VAR=$(expr $ARG $OP $ARG2)

[root@centos6~]#sum4=$(expr2+8) [root@centos6~]#echo$sum4 2+8 [root@centos6~]#sum4=$(expr2+8) [root@centos6~]#echo$sum4 10

这种是调用expr命令计算后面运算表达式,它要求数值与运算符之间有空格,没有空格则不进行计算,保持运算表达式原本模样赋值给变量。

注 :它与上述三种不同之处还有如果有乘法运算,乘法符号*在第四种里面需要加 \ 进行转义。

以下为四种算术运算在乘法中的表现

[root@centos6~]#sum4=$(expr2*8) expr:语法错误 [root@centos6~]#sum4=$(expr2\*8) [root@centos6~]#echo$sum4 16 [root@centos6~]#letsum1=6*6 [root@centos6~]#echo$sum1 36 [root@centos6~]#sum2=$[2*3] [root@centos6~]#echo$sum2 6 [root@centos6~]#sum3=$((3*4)) [root@centos6~]#echo$sum3 12

第四种需要转义,其他三种不需要。

本文永久更新链接地址 : http://www.linuxidc.com/Linux/2016-08/134660.htm


Viewing all articles
Browse latest Browse all 11063

Trending Articles