手机版
你好,游客 登录 注册
背景:
阅读新闻

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

[日期:2016-08-27] 来源:Linux社区  作者:chawan [字体: ]

什么是变量?

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

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

变量的特点

变量分强类型变量,与弱类型变量

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

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

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

 

变量名的命名规范

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

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


 

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

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

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

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

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

变量赋值:name=‘value’

value有如下引用类型

 

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

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

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

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

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

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

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

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

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

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

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

撤销已定义的变量,格式:unset 变量名

1
2
3
4
5
[root@centos7 ~]# echo $name5
$name1
[root@centos7 ~]# unset name5
[root@centos7 ~]# echo $name5
[root@centos7 ~]#

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

 

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

1
2
3
4
5
6
7
[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

1
2
3
4
5
6
[root@centos7 ~]# 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

1
2
3
4
5
6
[root@centos7 ~]# 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

1
2
3
4
5
6
[root@centos7 ~]# printenv | head -5
XDG_SESSION_ID=8
HOSTNAME=centos7
SELINUX_ROLE_REQUESTED=
TERM=linux
SHELL=/bin/bash

env

1
2
3
4
5
6
[root@centos7 ~]# printenv | head -5
XDG_SESSION_ID=8
HOSTNAME=centos7
SELINUX_ROLE_REQUESTED=
TERM=linux
SHELL=/bin/bash

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

1
2
3
4
5
6
7
8
[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

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

1
2
3
4
5
6
[root@centos7 ~]# export name6=$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:表示命令本身

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

1
2
3
4
5
6
7
8
[root@centos7 test]# cat var1.sh 
#!/bin/bash
#
echo "$1" 
echo "$2"
echo "$#"
echo "$@"
echo "$*"

wKioL1ev-1mCXOcbAAAVpS__va0046.gif

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

 


算术运算

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

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

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

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

1
2
3
[root@centos7 test]# let sum1=1+10
[root@centos7 test]# echo $sum1
11

2)VAR=$[算术表达式]

1
2
3
[root@centos7 test]# sum2=$[2+2]
[root@centos7 test]# echo $sum2
4

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

1
2
3
[root@centos7 test]# sum3=$((5+5))
[root@centos7 test]# echo $sum3
10

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

1
2
3
4
5
6
[root@centos6 ~]# sum4=$(expr 2+8)
[root@centos6 ~]# echo $sum4
2+8
[root@centos6 ~]# sum4=$(expr 2 + 8 )
[root@centos6 ~]# echo $sum4
10

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

 

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@centos6 ~]# sum4=$(expr 2 * 8 )
expr: 语法错误
[root@centos6 ~]# sum4=$(expr 2 \* 8 )
[root@centos6 ~]# echo $sum4
16
[root@centos6 ~]# let sum1=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

linux
本文评论   查看全部评论 (1)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 1 楼
* BensonLaur会员 发表于 2016/9/7 15:49:06
不错,排版很好,谢谢分享