前言
Hello,各位码友,大家早上好啊,感谢点开这篇文章。首先在这里祝大家五一假期快乐。不知道这个假期你是怎么安排的呢?如果还没有具体的安排,不如来和我一起学习Linux吧。
本章主要讲述的内容是Linux中的变量、数组、和算术运算与测试,希望本次分享能够有所帮助。喜欢的话点个【一键三连】支持下呗,感激不尽。同时也欢迎大家一起交流讨论,我在评论区等你们。↓↓↓
变量
自定义变量
变量是用来存储非固定值的载体,它具有一个值,以及零个或者多个属性,在Shell中定义变量的语法格式如下:
name=[value]
如果value没有指定,变量将被赋值为空字符串,变量定义后使用<$变量名称>来调用变量的值。变量名称为字母、数字以及下划线的组合,但是首字母不可以为数字(讲到这里会发现这种定义格式类似Java的变量定义格式),变量名没有硬性的大小写的要求,但是在此建议统一使用大写或者首字母大写的方式来定义变量。默认NAME的值是可以被修改的,但是我们可以通过typeset
为这个变量添加只读属性来防止误操作,如果需要限定变量的值仅可以设置为整数,也可以通过使用该命令来添加相应的属性。
[root@localhost ~]# NAME=tomcat
[root@localhost ~]# echo $NAME
tomcat
[root@localhost ~]# typeset -r NAME #添加readonly只读属性
[root@localhost ~]# NAME=jerry
bash: NAME: 只读变量
如果希望预先定义一个变量,但暂时不赋值给它,可以使用declare
命令
[root@localhost ~]# declare INT_NUMBER
[root@localhost ~]# typeset -i INT_NUMBER #使用-i选项设置整数变量
[root@localhost ~]# INY_NUMBER=test #强制为该变量赋值字符型数据
[root@localhost ~]# echo $INT_NUMBER #查看变量结果为空
[root@localhost ~]# INT_NUMBER=200
[root@localhost ~]# echo $INT_NUMBER
200
此外,还可以通过 read命令来设置变量,read从标准输入中读取变量值,使用-p选项可以添加相应的提示信息。
[root@localhost ~]# read P_NUMBER #回车后输入要赋值给P_NUMBER的值
22
[root@localhost ~]# echo $P_NUMBER
22
[root@localhost ~]# read -p "Please input a number:" P_NUMBER
Please input a number:100 #在提示符后输入要赋值给变量的值
[root@localhost ~]# echo $P_NUMBER
100
[root@localhost ~]# set #查看当前系统中设置的所有变量及值
[root@localhost ~]# unset P_NUMBER #删除变量
变量的使用范围
使用name=[value]的形式定义的变量 默认仅在当前Shell中有效,子进程不会继承这样的变量,使用export
命令会将变量放入环境中,这样新的进程会从父进程那里继承环境,export
可以直接定义环境变量并赋值,也可以先定义一个普通的用户变量,再通过export
转换为环境变量。
[root@localhost ~]# TEST=pass
[root@localhost ~]# echo $TEST
pass
[root@localhost ~]# bash #在当前Shell下开启新进程bash
[root@localhost ~]# echo $TEST #查看变量值为空
[root@localhost ~]# exit
exit
[root@localhost ~]# export TEST #将已有用户变量添加至环境
[root@localhost ~]# export NAME=tom #直接定义环境变量
环境变量
Bash预设了很多环境变量,在实际的工作中,我们可以直接调用这些变量。在下面的表格中列出了一些比较常用的变量名称及其含义。关于变量的详细定义可以可以参考Bash手册。
Bash手册PDF阅读,点击这里(侵删)
变量名称 | 含义 |
---|---|
BASHPID | 当前bsh进程的进程号 |
GROUPS | 当前用户所属组的组ID好 |
HOSTNAME | 当前主机的主机名称 |
PWD | 当前工作目录 |
OLDPWD | 前一个工作目录 |
RANDOM | 0~32767之间的随机数 |
UID | 当前用户的ID号码 |
HISTSIZE | 命令历史的记录条数 |
HOME | 当前用户的家目录 |
PATH | 命令搜索路径 |
PS1 | 主命令提示符 |
PS2 | 次命令提示符 |
以上这些变量中,有些是可以设置的,有些则是只读而不可设置的。这里我们重点看一下【PATH】变量,在Linux系统中,我们输入一个ls
命令就可以查看当前目录文件列表,那么系统怎么知道ls
命令存放在哪里?其实,Linux系统是通过【PATH】变量来搜索命令的,【PATH】变量的值就是一个目录集合,系统会按照顺序查找这些目录,如果找不到,则提示命令未找到(这里暂时先不考虑别名与函数的问题)。
[root@localhost ~]# echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/centos7/.local/bin:/home/centos7/bin
[root@localhost ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg
根据以上说明,我们知道用户在命令行中输入ls
命令后系统就开始在【/usr/local/sbin/】目录下查找这个命令,如果找到就执行这个命令,没有则继续查找下一个目录,如果搜索到最后都没有找到ls
程序,则提示没有找到。
对于PATH路径的修改需要注意,不可以直接对其赋新值,否则将覆盖PATH现有的值。下面将PATH直接复制【/root】目录,则以后再执行一个简单的ls
命令豆浆提示命令没有找到。因为系统只会在【/root】目录下查找有没有ls
命令。
[root@localhost ~]# PATH=/root
[root@localhost ~]# ls
bash: ls: 未找到命令...
上面的修改因为并没有通过写入文件的方式把修改永久保存至环境变量,所以只要退出命令行重新登录终端【PATH】将复原即可。那么对该变量修改的正确方法是在原来的基础上修改,所以在赋值时需要引用旧值。
[root@localhost ~]# PATH=$PATH:/root
位置变量
位置变量的使用一般体现在脚本中,关于Shell脚本的详细内容请参考我的博客:http。位置变量使得在脚本中的命令可以调用运行脚本时不同位置的参数,参数一般使用空格分隔,$0
代表当前Shell程序的文件名称,$1
代表运行Shell程序时的第一个参数,$2
为第二个参数,依此类推(范围为$1~$9
)。
使用Shell位置变量有助于我们我们查看很多相关的信息,$#
代表Shell程序所有参数的个数;$*
和$@
均代表所有参数的内容,区别是$*
将所有的采纳数作为一个征途,而$@
将所有的参数分别作为个体看待;$$
代表当前进程的ID号码,$?
表示程序的退出代码(一般0代表命令执行成功,非0代表命令执行失败)。
下面我们通过编写一个脚本并运行它来查看效果。
[root@localhost ~]# vim /tmp/test.sh #编辑脚本内容如下
#!/bin/bash
#This is test script for parameter!
echo "This is the file name: $0"
echo "This is first parameter: $1"
echo "This is second parameter: $2"
echo "This is the number of all parameter: $#"
echo "This is the all parameter: $*"
echo "This is the all parameter: $@"
echo "This is PID: $$"
[root@localhost ~]# bash /tmp/test.sh a b c
This is the file name: /tmp/test.sh
This is first parameter: a
This is second parameter: b
This is the number of all parameter: 3
This is the all parameter: a b c
This is the all parameter: a b c
This is PID: 3385
数组
Bash提供了一维数组变量的功能,数组中的所有变量都会被编录成索引,数组对的索引是以0开始的整数,,并且没有大小限制。一般可以使用两种方式创建数组变量。第一种使用name[subscript]=value
的语法格式定义的变量自动创建索引数组,其中subscript
必须是大于或者等于0的表达式;第二种使用name(value1 value2 ... value)
的语法格式创建。使用declare -a <name>
可以预定义一个空数组变量。
数组定义完成后,我们使用${name[subscript]}
索引格式来调用数组变量的值,如果说subscript
是【@】或者【*】符号,则将调用所有的数组成员。使用${#name[subscript]
可以返回${name[subscript]}
的长度,如果subscript
是【@】或者【 *】,则返回数组元素的个数。
来,我们一起来实战一下:
[root@192 ~]# A[1]=11
[root@192 ~]# A[2]=22
[root@192 ~]# A[3]=33
[root@192 ~]# echo ${A[1]},${A[2]},${A[3]}
11,22,33
[root@192 ~]# echo ${A[1]}:${A[2]}:${A[3]}
11:22:33
[root@192 ~]# echo ${A[*]}
11 22 33
[root@192 ~]# echo ${A[@]}
11 22 33
算术运算与测试
在Shell中进行算术运算时,使用$((expressioon))
语法格式可以实现整数级的算术运算功能。其中。expressioon
为算术表达式。
下面的表格中罗列出了常用的算术表达式机器对应的含义:
表达式 | 含义 |
---|---|
$((x+y)) | 加法运算 |
$((x-y)) | 减法运算 |
$((x/y)) | 除法运算,结果保留整数位 |
$((x*y)) | 乘法运算 |
$((x%y)) | 取余运算 |
$((x++)) | 自加运算 |
$((x–)) | 自减运算 |
$((x**y)) | 幂运算,x的y次方 |
除此之外,命令工具【expr】也可以实现如下类似的算术运算。
expr arg1 + arg2
加法expr arg1 - arg2
减法expr arg1 \* arg2
乘法expr arg1 / arg2
除法expr arg1 % arg2
取余
Shell除了提供上述所说的算数运算符外,,还提供了一些判断功能,使用Bash内置命令test
即可实现测试工作,或者使用[ 测试表达式 ]
,两种方式的最终结果相同。注意,使用[ 表达式 ]
的时候在表达式的两遍都要留空格,如果没有留下空格就是错误的语法格式。Linux可以对很多内容做测试工作。
下面的表格中列出了常用的测试条件及其含义:
测试选项 | 含义 |
---|---|
-d FILE | FILE是否存在且为目录 |
-f FILE | 文件是否存在且为普通文件 |
-w FILE | 文件是否存在且可写 |
-s FILE | 文件是否存在且非空 |
-e FILE | 文件是否存在 |
-r FILE | 文件是否存在且可读 |
-x FILE | 文件是否存在且可执行 |
-h FILE | 文件是否为链接文件 |
-n STRING | 字符串长度非0 |
- z STRING | 字符串长度为0 |
STRING1 = STRING2 | 字符串相等 |
STRING1 != STRING2 | 字符串不相等 |
INTER1 -eq INTER2 | 整数1与整数2相等 |
INTER1 -gt INTER2 | 整数1大于整数2 |
INTER1 -lt INTER2 | 整数1小于整数2 |
INTER1 -ge INTER2 | 整数1大于或等于整数2 |
INTER1 -le INTER2 | 整数1小于或等于整数2 |
INTER1 -ne INTER2 | 整数1不等于整数2 |
[root@192 ~]# test -d /etc/ && echo "Y" || echo "N" #ettc是目录就显示Y,否则显示N
Y
[root@192 ~]# test -d /etc/passwd && echo "Y" || echo "N"
N
[root@192 ~]# [ -d /etc/ ] && echo "Y" || echo "N"
Y
[root@192 ~]# [ -e /etc/passwd ] && echo "Y" || echo "N"
Y
[root@192 ~]# [ -f /etc/password ] && echo "Y" || echo "N"
N
[root@192 ~]# [ -h /etc/grub.conf ] && echo "Y" || echo "N"
N
[root@192 ~]# [ -n $PATH ] && echo "Y" || echo "N"
Y
[root@192 ~]# [ -z $tt ] && echo "Y" || echo "N"
Y ##tt变量未定义,,所以为空字符串
[root@192 ~]# [ -z $PATH ] && echo "Y" || echo "N"
Y
[root@192 ~]# [ 22 -eq 22 ] && echo "Y" || echo "N"
Y
[root@192 ~]# [ 32 -ge 22 ] && echo "Y" || echo "N"
Y
[root@192 ~]# [ 10 -ge 22 ] && echo "Y" || echo "N"
N
[root@192 ~]# [ 10 -le 22 ] && echo "Y" || echo "N"
Y
本次分享就到这里了,你学废了吗?
五一假期不打烊,不定时更新,希望有所帮助。
夏欢的话点个【一键三连】支持一下呗,感激不尽!!!