目录
之前讲到了shell脚本的概念和它大概是怎样的一个运行模式,以及如何运行一个shell脚本。接下来需要讲shell脚本中一个非常重要的东西,那就是变量。
一、什么是变量
还是同样的,讲一个东西之前,我们要先知道,什么是变量呢?其实和数学中的变量x差不多,只不过这个变量不只是x,可以是任何数字字母组成(特殊字符和空格除外),然后呢这个变量也不是像数学里那样有什么定义域是随机的,它的值是我们主动赋予的。如果这么说不理解的话,我们举个例子。
如果,x=1,那我输出x的话,会话框里会显示什么内容?
很明显,会显示1啊。
那么,再稍微来个复杂那么一丢丢的例子
定义一个变量 beijing=capital
然后我们输出 beijing 会显示什么?
会显示 captial ,如图
注意:这个 $ 就是引用变量的值,如果没有 $ ,那么只会输出beijing
变量这个东西还是很好理解的吧?
二、变量的类型
变量也分很多种,有自定义变量、环境变量、只读变量、位置变量、预定义变量
用的最多的应该就是自定义变量了,我们着重讲一下自定义变量,其他的看情况就稍微介绍一下吧。
1. 自定义变量
自定义变量很好理解,就是我们自己创建的变量,用于储存一些值,我们之前演示的两个例子,就都属于自定义变量。
想要输出这些变量的值,就通过 $ 来实现
好,我们知道了自定义变量,知道了如何使用这个自定义变量,现在有问题了,我们使用自定义变量来干什么呢?
1.1 基本的四则运算
关于自定义变量可以展开许多用法,比如排序、函数等等,我们先从简单的开始,先用自定义变量进行简单的四则运算。
+ - * / 加减乘除,这个应该不用多解释了,那么这些符号怎么使用?
先从数字开始举例,这里要用到一个命令,expr,expr命令可以对整数进行运算
很好理解吧,echo 只是输出了1 + 1这个整体,二expr对1+1进行了运算 (注意空格)
接下来我也不一一细讲了,主要是要知道它的输入规则,知道了之后就一通百通了。但是,乘法要特别强调一下,乘法的 * 号,在输入的时候会提示语法错误,因为 * 在Linux中作为一个特殊字符有其他的含义,所以,我们需要使用 \ (转义符) 来将 * 号回归它的初衷,取消它的特殊含义。下面是一些案例,都很简单易懂,主要是要记住。
这里最后一个%是取余的意思,就是被除数 整除 除数,得到的余数
expr 不仅可以进行数字的运算,也可以进行变量的运算,比如定义了x=1,y=1
那么直接 expr $x + $y 就可以了,注意符号两边需要空格
同样也是非常好理解的,就不多赘述
那么,我偏要用echo就行四则运算,怎么办呢?其实用 echo 也是可以的,只不过步骤比较繁琐一点
其实就是加了个$符,如何套了两个小括号,或者一个中阔号,没什么说法。
细心的你可能发现了,这里*号前面没有加\,对的,括号里的符号不需要转义
1.2 let
现在出现了新的问题了,这里只有加减乘除啊(还有取余),既然是可以计算,那乘方运算呢?
这里就需要用到 let 命令,let 可以通过运算改变变量的值,但是不会显示,需要echo将其输出我们才能看见,举个简单的例子就可以看明白了
let 是完成了计算的,就是我们不知道而已
现在我们言归正传,乘方怎么实现呢?
其实很简单,就是两个 * 号就可以了
比如 let x=3 ** 3
那么x的输出结果就是27
1.3 自增自减
然后有个和循环息息相关的东西,就是自增 i++ 和自减 i-- ,什么是自增自减呢?就是假如给x=1,那么 x ++ 就是每执行一次,x就+1,执行n次就 + n,自减就是反过来
自减同理,就是反过来
这玩意有啥用呢?每次加一个,其实这个就类似于计数器,在执行某一操作的时候我配上自增,最后看自增的结果就可以知道执行了多少次操作,自减的话相当于设置了一个阈值吧,比如减到0,我就终止某操作,这个后面讲循环嵌套的时候再洗说,现在只要知道什么是自增自减就行了。
1.4 小数运算
然后,说了大半天,有人肯定会问,怎么全是整数运算?作为一个计算机,小数运算都没法操作吗?
小数运算也是可以实现的,使用bc进行运算,支持小数运算,但在脚本中不可直接使用否则会进入交互界面,可以用echo结合管道使用
scale=x ---用来指定小数点后x位
这个也是只要讲一下如何使用,规则是啥,知道了就一通百通了,主要是多敲,敲完了记住,这里你可以算出我的x、y分别设的是多少吗?(不用算我就是自己做的时候都忘了前面设的多少了)
除此之外,bc命令还可以做逻辑判断,如果结果为真输出1,结果为假输出0,什么个意思呢?
就是这么个意思,和C语言一样,等于号要写==,!=是 ‘不等于’ 的意思,所以3不等于2,输出结果为真
2.其他变量
其他的变量都不是那么的重要,我就简单的概述概述吧
2.1 环境变量
环境变量是在操作系统中预定义的一组动态命名值,用于影响程序行为。它们在Shell脚本中用来传递配置和操作系统信息
常见的环境变量有:PATH(指定可执行文件的搜索路径)、HOME(当前用户的主目录)、USER(当前登录的用户名)、SHELL(当前用户的默认Shell解释器)、LANG(当前系统语言设置)、RANDOM(随机数)。
这些具体也没什么好解释的,就是字面含义,要多说一句的就是随机数是生成0—32767的随机数
PATH作为路径是可以修改的,我们之前切换到别的目录后,shell脚本需要加上bash 或者 sh 或者绝对路径才可以执行
pwd 查看当前路径,
PATH="$PATH:/当前路径",就可以直接使用命令了
注意PATH后面千万不能为空,为空的话会很麻烦
2.2 只读变量
顾名思义,只可以读取,不能修改或者删除的变量,只读变量一旦设置后,其值不可改变。它们用于定义常量,以防止脚本中意外更改这些值
可以看到,没办法对 b 进行任何操作,那么我现在就像对 b 进行操作,该怎么办呢?先出去一下,就好了
2.3 位置变量
位置变量用于获取传递给脚本或函数的命令行参数,就是,当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
说起来可能有点抽象,还是用例子来说明吧
首先编辑一个 .sh 文件,里面内容写上这些
编写完之后保存退出,我们来解读一下,首先脚本会执行useradd命令,useradd命令是需要用户名的,此时$1 就是用户名, 然后脚本执行passwd,将 $2 输入到 $1用户中,这里的$1 $2 ,就是位置变量,如果脚本还有其他要执行的命令就依次传入$3 $4 ...
具体就是这么用的,可以看到lbw 用户被创建的了,而且还设有密码
2.4 预定义变量
预定义变量由Shell预先定义,用于存储Shell会话的特定信息和状态
常见的状态有
$!:最后一个后台进程的PID。
$@:表示列出所有位置参数,但是是以单个的形式的列出
$#:表示命令行中位置参数的个数
$$ :当前Shell进程的PID。
$*:表示所有位置参数的内容,这些内容当做一个整体
$0:表示当前执行的脚本或程序的名称
$_:上一个命令的最后一个参数或命令的结果。
$?:上一个命令的退出状态码。
用法也和环境变量一样,直接echo 就好了
一些其他的补充的
双引号 " " 用于保留字符串中的大部分字符,但允许变量和命令替换,在双引号中,$
和 \
仍然具有特殊含义,其他字符会被视为普通字符。
单引号 ' ' 用于保留字符串中的所有字符,包括空格、特殊字符等。单引号内的内容不会进行变量替换或命令替换,单引号中,所有字符都会被视为普通字符。
反引号 ` ` 用于命令替换,即将反引号中的命令执行并将结果插入到字符串中,在某些情况下会被替代为$()这在嵌套命令时更为清晰。
暂时先讲这么多吧,之后会继续增加内容,欢迎大家一起学习。