在程序设计语言中,变量是一个非常重要的概念。也是初学者在进行Shell程序设计之前必须掌 握的一个非常基础的概念。只有理解变量的使用方法,才能设计出良好的程序。本节将介绍Shell中变量 的相关知识。
1、什么是变量
顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。几 乎所有的程序设计语言中都有定义变量,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存 用户数据的一块内存空间,而变量名就是这块内存空间的地址。
在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地 址的变量名却保持不变。
2、变量的命名
- 可以使用数字,字母,和下划线给变量命名
- 不能用数字开头
- 如果给同一个变量赋值多次,最后一次赋值会覆盖之前的值
合法的变量名:name NMAE name1 name_1 Name_1
不合法的变量名:1name name*1 name_1%
3、查看变量的值
1.查看单个变量的值
- echo $PATH
- echo ${PATH}
- printf "$PATH\n"
- printf "${PATH}\n"
2.查看多个变量的值
- set:查看所有的变量和函数
- declare:查看所有的变量和函数
- env:显示所有的全局变量
4、变量的定义
在命令行中定义:退出当前进程后该变量就失效,其他终端上无法使用该变量
var='xiaoming2'
var="`cmd`"
var="$(cmd)"
在文件中定义:永久生效
当前用户生效的文件
~/.bashrc 和 ~/.bash_profile
所有用户生效的文件
/etc/bashrc , /etc/profile ,/etc/profile.d/*.sh
su和su -切换方式加载的文件不同:
[root@node13 ~]# su - studentLast login: Sun Sep 18 23:06:43 CST 2022 on pts/0/etc/profile/etc/profile.d/name3.sh/etc/bashrc/home/student/.bash_profile/home/student/.bashrc/etc/bashrc[root@node13 ~]# su student/home/student/.bashrc/etc/bashrc/etc/profile.d/name3.sh
5、变量的分类
(1)局部变量(普通变量):只在某个特定范围生效的变量,比如只能在当前进程中使用的变量,只能 在函数中使用的变量。
在命令行设置:在当前进程生效
在脚本文件中设置:在脚本文件中生效
在函数中定义普通变量:local var="value",只在当前函数中生效
在用户登录时加载的文件中设置:在脚本文件中无法使用
(2)全局变量(环境变量):可以在创建他们的shell及其派生出来的子进程中使用(su 切换用户的时 候会读取新的环境变量)。
自定义环境变量和bash内置的环境变量。
1.自定义环境变量
- export var或 export var="value"
- declare -x var="value", bash内置环境变量 declare +x var可取消环境变量
2.bash内置环境变量
shell程序在运行时,会接受一组变量来确定登录用户名、命令路径、终端类型、登录目录等等,这 些变量就是环境变量。shell内置的环境变量是所有的shell程序都可以使用的变量,环境变量会影响 所有的脚本的执行结果。
3.位置参数和预定义变量
很多情况下,shell脚本需要接受用户的输入,根据用户的输入来执行不同的操作。
从命令行传递给shell脚本的参数又称为叫做位置参数,shell脚本会根据参数的位置使用不同的位置参数 变量读取他们的值
6、取消变量
unset var
7、 变量的运算
应用场景
1. 计数器:在循环中使用变量来计数,例如计算文件的数量或循环迭代次数。
2. 计算和比较:在脚本中进行条件判断时,可能需要比较两个数值变量的大小。
3. 数据处理:处理文本数据时,可能需要修改字符串的长度或进行字符编码转换。
4. 系统资源管理:根据系统资源使用情况(如内存或磁盘空间)进行计算,以决定是否执行特 定操作。
5. 时间计算:计算脚本执行时间,或者根据日期和时间进行运算。
6. 配置和设置:根据脚本输入或环境变量计算配置参数。
与其他的程序设计语言一样,shell也有很多运算符。
示例:
[root@localhost ~]# r=$((2+5*8))[root@localhost ~]# echo $r42
[root@localhost ~]# let r=3+2[root@localhost ~]# echo $r5[root@localhost ~]# r=`expr 4+2`[root@localhost ~]# echo $r4+2[root@localhost ~]# r=`expr 4 + 2`[root@localhost ~]# echo $r6#使用expr计算字符的长度
[root@localhost test4]# char="i have a"[root@localhost test4]# expr length "$char"8[root@localhost ~]# r=$[3+2][root@localhost ~]# echo $r5[root@localhost ~]# awk 'BEGIN {print 2+3*2}'8[root@localhost test4]# echo "6.282 3.14" | awk '{print ($1-$2)}'3.142[root@localhost ~]# declare -i r=3+2[root@localhost ~]# echo $r5
实验:计算用户输入的任意两个整数的和、差、乘积、商、余数。
方法一:
[root@localhost test4]# cat 1.sh
#!/bin/basha=$1b=$2echo a+b=$(($a+$b))echo a-b=$((a-b))echo a*b=$((a*b))echo a/b=$((a/b))echo a%b=$((a%b))[root@localhost test4]# ./1.sh 10 3a+b=13a-b=7a*b=30a/b=3a%b=1
方法二:
[root@localhost test4]# cat 1.1.sh
#!/bin/bashread -p "please input two number:" a becho $a+$b=$(($a+$b))echo $a-$b=$((a-b))echo $a*$b=$((a*b))echo $a/$b=$((a/b))echo $a%$b=$((a%b))[root@localhost test4]# ./1.1.sh
please input two number:3 43+4=73-4=-13*4=123/4=03%4=3
示例:截取字符串
[root@localhost ~]# str1="hello world"#返回变量长度
[root@localhost ~]# echo ${#str1}11#变量截取
#指定起始位置,一直到结束
[root@localhost ~]# echo ${str1:1}ello world#指定长度,不指定起始位置默认从开头开始
[root@localhost ~]# echo ${str1::3}hel#指定起始位置和长度
[root@localhost ~]# echo ${str1:1:3}ell#从右边第几个字符开始,及字符的个数
[root@localhost ~]# echo ${str1:0-1:1}d#输出右边的几个字符
[root@localhost ~]# echo ${str1:0-5}world[root@localhost ~]# echo ${str1: -5}world#提取完整字符串
[root@localhost ~]# echo ${str1:-5}hello world
示例:删除字符串
#获取后缀名tar.gz[root@localhost ~]# filename=testfile.tar.gz[root@localhost ~]# file=${filename#*.}[root@localhost ~]# echo $filetar.gz#获取后缀名.gz[root@localhost ~]# filename=testfile.tar.gz[root@localhost ~]# file=${filename##*.}[root@localhost ~]# echo $filegz#截取testfile.tar[root@localhost ~]# filename=testfile.tar.gz[root@localhost ~]# file=${filename%.*}[root@localhost ~]# echo $filetestfile.tar#截取testfile[root@localhost ~]# filename=testfile.tar.gz[root@localhost ~]# file=${filename%%.*}[root@localhost ~]# echo $filetestfile