bash变量及bash脚本编程算术运算介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash变量及bash脚本编程算术运算介绍相关的知识,希望对你有一定的参考价值。

1、常用命令bash特性命令介绍:

hash命令

作用:缓存此前命令的查找结果,缓存外部命令,不能缓存内嵌命令;加快程序运行

用法:他是一个内嵌命令

[[email protected] ~]# hash     //查看此前运行过的命令的查找结果

hitscommand

   1/usr/bin/grep

[[email protected] ~]# 

  

[[email protected] ~]# hash -d command      //删除命令(command)的查找结果

[[email protected] ~]# hash -r    //清空hash列表,一般用来当命令被移动到其他位置时,需要清空


bash多命令执行:

各命令间用分号(;)隔开,命令间无逻辑关系,一次执行

多命令格式:

    ~]#command1;command2;command3 ....

如:    

[[email protected] ~]# ls;cat /etc/issue

anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates

Desktop          Downloads  Music                 Public    Videos

\S

Kernel \r on an \m


[[email protected] ~]# 


bash特性之逻辑关系:

运算数:

    真表示方法:true、yes、on、1

    假表示方法:false、no、off、0

运算方法:

    与:&& ;1&&1=1,1&&0=0,0&&1=0,0&&0=0

    或:|| ;1||1=1,1||0=1,0||1=1,0||0=0

    非:! ;!1=0,!0=1

与短路运算:如果前一个执行结果为假,则结果为假;

或短路运算:如果前一个执行结果为真,则结果为真;


~]command1 && command2 && 。。。    

命令执行状态结果作为与运算,与运算中,前一个命令执行失败,后面的命令将不再执行;若前一个命令执行成功,则执行后一个命令;command1执行失败,不在执行comamnd2;反之则需执行command2

~]command1 || command2 || 。。。

命令执行状态结果作为或运算,或运算中,前一个命令执行失败,后面的命令必须执行;若前一个命令执行成功,则不再执行后一个命令;command1执行失败,必须执行comamnd2;反之则不再执行command2

如:

[[email protected] ~]# touch /tmp/test.etc && ls /etc/ > /tmp/test.etc

如果创建test.etc的状态结果为真,则执行后面命令:ls /etc/ > /tmp/test.etc


[[email protected] ~]# id lucy || useradd lucy

id: lucy: no such user

[[email protected] ~]# tail -1 /etc/passwd

lucy:x:2008:2008::/home/lucy:/bin/bash

[[email protected] ~]# 

如果lucy用户不存在,则创建lucy用户。




2、bash变量介绍

程序是由指令+数据组成的;也可以看成是由算法+数据结构组成。

其中,指令由程序文件提供,数据由标准输入(I/O)、文件、管道、变量等提供。


变量:由变量名和内存空间组成,他是一个有命名的内存地址。


变量根据编程语言分类:

    强类型变量:不同变量类型不能相互操作,除非做变量类型转换

    弱类型变量:bash就是一种弱类型变量的编程语言;bash不支持浮点数据类型,除非借助外在工具;bash中的变量无需事先声明,这样就相当于把变量声明和赋值过程同时实现。


在强类型编程语言中,如c语言,变量需要初始化,因为变量中有随机数。


变量替换(变量引用):把变量名出现的位置,替换为其所指向的内存空间的数据。

变量引用方法:${var_name}或$var_name,建议用前者${var_name}规范写法。


3、bash变量分类:            

根据作用范围划分:

    本地变量:作用域为当前shell进程;同级shell或子shell不起作用;

    环境变量:作用域为当前shell进程及子进程;同级shell进程无效;

    局部变量:作用域为某代码片段;

其他分类:

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

    特殊变量:shell内置的特殊功用的变量,如:$?、


4、bash变量定义:

变量名命名法则:

    见名知意,

    不能使用程序的保留字,如if、else、then、while等。


4.1、本地变量

本地变量定义:

    name=value


本地变量引用:

    ${var_name}或$var_name

    "var_name" :弱引用,变量名会被替换成变量值

    ‘var_name‘ :强引用,变量名不会被替换成值

如:

[[email protected] ~]# name=lucy    //定义本地变量

[[email protected] ~]# echo $name    //引用变量

lucy

[[email protected] ~]# echo "name"

name

[[email protected] ~]# echo ‘name‘

name

[[email protected] ~]# 


查看本地变量:

#set

撤销本地变量:

#unset 变量名    //注意此处非变量引用,无需"$"符号

如:

[[email protected] ~]# unset name

[[email protected] ~]# echo $name


[[email protected] ~]# 


验证本地变量作用域方法:

    ①打开一个统计shell进程,查看变量值

    ②打开一个子shell进程,查看变量值。如:在bash提示符下直接输入bash(新建一个shell子进程),看看变量值是否可以被引用。


4.2、环境变量

环境变量定义:

    方法一:export name=value

    方法二:name=value

        export name

    方法三:declare -x name=value

    方法四:name=value

        declare -x value

注意:declare是内嵌命令。同时,bash内嵌了许多环境变量,通常为全大写字母,因此为了避免自定义和内置的环境冲突,不建议定义环境变量时大写。

PATH\HISTFILE\HISTSIZE\HISTFILESIZE\HISTCONTROL\SHELL\HOME\UID\PWD\OLDPWD


环境变量引用:

     ${var_name}或$var_name


查看环境变量:

    方法一:export

    方法二:declare -x

    方法三:printenv

    方法四:env

如:

[[email protected] ~]# export price=12

[[email protected] ~]# echo $price

12

[[email protected] ~]# bash

[[email protected] ~]# echo $price

12

[[email protected] ~]# exit

exit

[[email protected] ~]# export

declare -x XMODIFIERS="@im=ibus"

declare -x price="12"

[[email protected] ~]# 


撤销环境变量:

    #unset var_name


定义只读变量:

    方法一:declare -r var_name

    方法二:readonly var_name


[[email protected] ~]# declare -r price

[[email protected] ~]# unset price

bash: unset: price: cannot unset: readonly variable

[[email protected] ~]# 

[[email protected] ~]# readonly name=lili

[[email protected] ~]# unset  name

bash: unset: name: cannot unset: readonly variable

[[email protected] ~]# 

注意:变成只读变量后将无法撤销变量,变量存活时间为当前shell进程的生命周期,随shell终止而终止。


5、shell脚本编程介绍:

编程语言分类1:(根据运行方式)

    编译运行:将源代码 经 编译器编译 成程序文件

    解释运行:将源代码 经 解释器解释 边解释边运行。


编程语言分类2:根据其编程过程中功能的实现是调用库,还是调用外部的程序文件,又分如下两种:

    shell脚本编程:利用系统上的命令及编程组件进行编译

    完整编程:利用库或编程组件进行编程。


变成语言分类3:根据编程模型分类

    面向过程式的编程语言:以指令为中心来组织代码,数据服务于代码;顺序执行、选择则行、循环执行等,代表:c语言、bash脚本、c++、python

    面向对象的编程语言:以数据为中心来组织代码,围绕数据来组织指令;类、实例化话对象,代表:java、c++、python


shell脚本编程特性:

    过程式编程语言

    脚本语言、解释执行、依赖于外部程序文件运行。


5.1、shell脚本写法:

脚本文件第一行:顶格#!shebang   //解释器路径,用于指明解释执行当前脚本的解释程序文件。


常见的shebang(解释器)有:  

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl


脚本写法事例:

[[email protected] ~]# cat first.sh 

#!/bin/bash

id lily || useradd -M lily

id lily 

[[email protected] ~]# 


shell脚本如何写?

    命令的堆积

    很多命令不具备幂等性,需要用程序逻辑来判断运行条件是否满足,以避免其运行中发现的错误。


shell脚本的执行方法:

方法一:赋权执行权限,并直接运行此程序。

~]#chmod +x /path/shell.sh      //给脚本文件shell.sh加上执行权限

 ~]#/path/to/shell.sh    //给出shell脚本文件shell.sh完整路径执行;

或~]#./shell.sh        //也可以以相对路径执行


方法二:直接运行解释器,将脚本以命令行参数传递给解释器程序

~]#bash shell.sh     //可以是绝对路径,也可以是相对路径。


注意:脚本中的空白行会被解释器忽略,脚本中,除了shebang,余下所有以#开头的行,都会被视作注释行而被忽略,此即为注释行。


练习:

用脚本实现如下功能:

1>显示/etc/目录下所有以大写p或小写p开头的文件或目录本身

2>显示/var目录下的所有文件或目录本身,并将显示结果中的小写字母转换成大写字母后显示;

3>创建临时文件/tmp/myfile.xxxx

[[email protected] ~]# nano secondshell.sh

#!/bin/bash

ls -d /etc/[pP]*

ls -d /var/* | tr ‘a-z‘ ‘A-Z‘

mkdir /tmp/myfile.xxxx


6、bash脚本编程之算术运算:(+、-、*、/、**、%)

注意:bash中所有的数字都被视为字符串。

如:

[[email protected] ~]# var1=2

[[email protected] ~]# var2=10

[[email protected] ~]# echo "$var1+$var2"

2+10

[[email protected] ~]# 


算术运算格式:

    方法一:let var_name=算术表达式

    方法二:$[算数表达式]

    方法三:var=$((算术运算表达式))

    方法四:$(export $ARG1 OP $ARG2)     //不好用,也不常用

需要注意的是:乘法符号(*)在有些场景中需要使用转义符。

如:

[[email protected] ~]# var1=2

[[email protected] ~]# var2=10

方法一:

[[email protected] ~]# let sum=$var1+$var2

[[email protected] ~]# echo $sum

12

[[email protected] ~]# 

方法二:

[[email protected] ~]# echo $[$var1+$var2]

12

[[email protected] ~]# 

[[email protected] ~]# echo "$[$var1+$var2]"    //变量弱引用

12

[[email protected] ~]# echo ‘$[$var1+$var2]‘    //变量强引用

$[$var1+$var2]

[[email protected] ~]# 

方法三:

[[email protected] ~]# sum1=$(($var1+$var2))

[[email protected] ~]# echo $sum1

12

[[email protected] ~]# 

[[email protected] ~]# echo "$(($var1+$var2))"

12

[[email protected] ~]# 

方法四:

[[email protected] ~]# echo $(expr $var1 + $var2 )

12

[[email protected] ~]# 


练习:写一个脚本,完成如下功能:

1>添加三个用户

2>求三个用户的UID之和

[[email protected] ~]# nano third.sh

#!/bin/bash

id sh1 || useradd sh1

id sh2 || useradd sh2

id sh3 || useradd sh3

shid1=$(grep "sh1" /etc/passwd |cut -d: -f3)

shid2=$(grep "sh2" /etc/passwd | cut -d: -f3)

shid3=$(grep "sh3" /etc/passwd | cut -d: -f3)

let shidsum=$shid1+$shid2+$shid3

echo $shidsum

[[email protected] ~]# bash third.sh 

id: sh1: no such user

id: sh2: no such user

id: sh3: no such user

6033

[[email protected] ~]# 

[[email protected] ~]# tail -3 /etc/passwd

sh1:x:2010:2010::/home/sh1:/bin/bash

sh2:x:2011:2011::/home/sh2:/bin/bash

sh3:x:2012:2012::/home/sh3:/bin/bash

[[email protected] ~]# 


注意:命令的结果引用


~]#命令1 $(命令2)     //表示:命令2的执行结果作为参数传递给命令1使用
















以上是关于bash变量及bash脚本编程算术运算介绍的主要内容,如果未能解决你的问题,请参考以下文章

bash脚本编程之三 条件判断及算术运算

linux基础--Bash编程基础

bash脚本编程之算术运算

bash脚本编程之算术运算符

bash脚本编程之算术运算之+,-,*,/,**/%

Linux命令:bash脚本编程