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内嵌了许多环境变量,通常为全大写字母,因此为了避免自定义和内置的环境冲突,不建议定义环境变量时大写。 PATHHISTFILEHISTSIZEHISTFILESIZEHISTCONTROLSHELLHOMEUIDPWDOLDPWD 环境变量引用: ${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使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |