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

前端之家收集整理的这篇文章主要介绍了bash变量及bash脚本编程算术运算介绍前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

hash命令

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

用法:他是一个内嵌命令

[root@localhost ~]# hash//查看此前运行过的命令的查找结果

hitscommand

1/usr/bin/grep

[root@localhost ~]#


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

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


bash多命令执行:

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

多命令格式:

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

如:

[root@localhost ~]# 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


[root@localhost ~]#


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

如:

[root@localhost ~]# touch /tmp/test.etc && ls /etc/ > /tmp/test.etc

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


[root@localhost ~]# id lucy || useradd lucy

id: lucy: no such user

[root@localhost ~]# tail -1 /etc/passwd

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

[root@localhost ~]#

如果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' :强引用,变量名不会被替换成值

如:

[root@localhost ~]# name=lucy//定义本地变量

[root@localhost ~]# echo $name//引用变量

lucy

[root@localhost ~]# echo "name"

name

[root@localhost ~]# echo 'name'

name

[root@localhost ~]#


查看本地变量:

#set

撤销本地变量:

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

如:

[root@localhost ~]# unset name

[root@localhost ~]# echo $name


[root@localhost ~]#


验证本地变量作用域方法

①打开一个统计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

如:

[root@localhost ~]# export price=12

[root@localhost ~]# echo $price

12

[root@localhost ~]# bash

[root@localhost ~]# echo $price

12

[root@localhost ~]# exit

exit

[root@localhost ~]# export

declare -x XMODIFIERS="@im=ibus"

declare -x price="12"

[root@localhost ~]#


撤销环境变量:

#unset var_name


定义只读变量:

方法一:declare -r var_name

方法二:readonly var_name


[root@localhost ~]# declare -r price

[root@localhost ~]# unset price

bash: unset: price: cannot unset: readonly variable

[root@localhost ~]#

[root@localhost ~]# readonly name=lili

[root@localhost ~]# unset name

bash: unset: name: cannot unset: readonly variable

[root@localhost ~]#

注意:变成只读变量后将无法撤销变量,变量存活时间为当前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


脚本写法事例:

[root@localhost ~]# cat first.sh

#!/bin/bash

id lily || useradd -M lily

id lily

[root@localhost ~]#


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

[root@localhost ~]# nano secondshell.sh

#!/bin/bash

ls -d /etc/[pP]*

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

mkdir /tmp/myfile.xxxx


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

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

如:

[root@localhost ~]# var1=2

[root@localhost ~]# var2=10

[root@localhost ~]# echo "$var1+$var2"

2+10

[root@localhost ~]#


算术运算格式:

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

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

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

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

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

如:

[root@localhost ~]# var1=2

[root@localhost ~]# var2=10

方法一:

[root@localhost ~]# let sum=$var1+$var2

[root@localhost ~]# echo $sum

12

[root@localhost ~]#

方法二:

[root@localhost ~]# echo $[$var1+$var2]

12

[root@localhost ~]#

[root@localhost ~]# echo "$[$var1+$var2]"//变量弱引用

12

[root@localhost ~]# echo '$[$var1+$var2]'//变量强引用

$[$var1+$var2]

[root@localhost ~]#

方法三:

[root@localhost ~]# sum1=$(($var1+$var2))

[root@localhost ~]# echo $sum1

12

[root@localhost ~]#

[root@localhost ~]# echo "$(($var1+$var2))"

12

[root@localhost ~]#

方法四:

[root@localhost ~]# echo $(expr $var1 + $var2 )

12

[root@localhost ~]#


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

1>添加三个用户

2>求三个用户的UID之和

[root@localhost ~]# 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

[root@localhost ~]# bash third.sh

id: sh1: no such user

id: sh2: no such user

id: sh3: no such user

6033

[root@localhost ~]#

[root@localhost ~]# 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

[root@localhost ~]#


注意:命令的结果引用


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

原文链接:https://www.f2er.com/bash/390183.html

猜你在找的Bash相关文章