Linux Bash Shell编程(四):变量(上) 变量分类与相关操作
上一节,我们了解了Bash中的重定向以及特殊符号,从本节开始我们来一起探索Bash中变量的奥秘。本节我们先来了解下Bash中变量的基本知识以及对变量处理的操作方法。本节的部分内容(特殊符号等)在上一节中有叙述,不清楚的同学可以参阅上一节内容。
变量概述
变量是计算机内存单元,其中存放的值可以变化,Shell脚本将信息存放在变量中,变量有一个名字,可以方便地引用,可以保存设置,也可以保存临时信息
Bash变量设置规则
- Bash中的变量可以由字母、数字、下划线构成,但不能以数字开头
- Bash变量的默认类型是字符串型,如果要进行数值运算,则必须指定变量类型为数值型或使用特殊运算方法
- 在对变量赋值时,若变量值字符串中有空格,需要将整个值用引号包括,类同上一节
- 使用echo命令输出变量值时,Shell同样对变量值进行当场转义,若在其中使用转义符
\
请使用-e
参数激活转义 - 环境变量名通常为大写,用户声明环境变量时也建议大写,以便于区分
变量分类
- 用户自定义变量
- 环境变量:主要保存和系统操作环境相关变量,环境变量不能改名,但能新建
- 位置参数变量:主要用来向脚本中传递参数或数据,变量名不能自定义,变量作用是固定的
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也固定(位置参数变量也是预定义变量的一种)
变量分类介绍与操作
不同种类的变量操作大体相同,相同部分在用户自定义变量操作中写出,后面不再赘述
用户自定义变量
用户自定义变量由用户自由定义修改,一般变量名可以修改,也可删除,在不违反Bash变量设置规则的前提下可以任意创建
用户自定义变量仅在当前Shell中有效
声明变量(定义变量), 语法:
变量名
=变量值
注意,等号两边均没有空格,否则会被Shell识别为命令而报错,例如test1="Hello" #定义了test1变量并赋值为"Hello" test2='Hello World!\nI am Zheng' #定义了test2变量并赋值为一个字符串,并含有转义符 1test="Hello" #不能这样定义!!!变量不能以数字开头,见“变量设置规则”节
注意,第三行声明的变量名称非法,变量名不能以数字开头,第二行的变量值以’'单引号包含,因为其中有!特殊字符,若用双引号会报错,单引号消除
!
的特殊含义,详见上一节调用变量,语法:$
变量名
,例如,用echo
命令将上面定义的两个变量输出zheng@Kali:~$ echo $test1 Hello zheng@Kali:~$ echo $test2 Hello World!\nI am Zheng zheng@Kali:~$ echo -e $test2 #test2变量值中包含转义符,需要用-e选项激活转义符 Hello World! I am Zheng
变量叠加:在变量后追加一部分内容而前面部分不变,用括号与引号包含原变量并在后面写入追加内容,注意括号与引号的位置不同
#语法:追加内容以123为例 test="$test"123 test=${test}123 #示例:在变量test1上追加内容 zheng@Kali:
$ test1="$test1"" World" #追加的内容含有空格,故用引号包含 zheng@Kali:$ echo $test1 Hello World另外,使用
set
命令可以查看当前定义的所有变量和函数(不只是用户自定义变量)删除变量:
unset
命令以删除变量#语法:unset 变量名 只需要变量名即可 #示例,以删除test1为例: unset test1
环境变量
一部分为系统环境变量,无法修改名称,只能修改值,作用固定,用户可以另行添加环境变量
环境变量会在当前Shell和这个Shell的所有子Shell中生效(子Shell是由Shell创建的Shell,可通过命令
pstree
查看进程树以查看Shell关系)将环境变量写入配置文件,则在所有shell中都永久生效(不写入配置文件不能永久生效),环境变量配置文件在下一节讲到
环境变量定义:语法
export
变量名
=值
;将变量声明为环境变量export
变量名
export test="Hello" #新定义一个环境变量 export test #将定义的test变量声明为环境变量
查询环境变量:命令
env
查询当前的环境变量调用、删除同用户自定义变量。
问题:子Shell能否
unset
父Shell声明的环境变量?可以,但只是删除子Shell环境中的环境变量,父Shell中依然存在
常用环境变量
$PATH
是系统查找命令的路径(变量只增加不能覆盖)。内容为以冒号分割的路径,Shell中的命令补全以及执行都按照PATH
环境变量中所指定的目录寻找$PS1
其实PS1
变量是环境变量中的子分支,不能用env
命令查看,只能用set
,定义了当前命令提示符样式
转义符搭配
作用
\d
显示日期
\h
显示简写主机名
\t
显示24小时制时间"HH:MM:SS"
\T
显示12小时制时间"HH:MM:SS"
\A
显示24小时制时间"HH:MM"
\u
显示当前用户名
\w
显示当前所在工作目录的完整名称
\W
显示工作目录的最后一个目录
显示当前命令序号
$
命令提示符,root#;普通用户$
先查看一下当前的PS1
变量值
zheng@Kali:~$ echo $PS1
\u@\h:\w$
可以按照喜好对自己的命令提示符显示格式进行修改,如增加时间等
位置参数变量
位置参数变量是预定义变量中的一种,比较少所以单独讨论
位置参数变量的变量名及作用是固定的,不能修改其变量名称,只能对其赋值(无需手动,只需要在命令行后按空格分开附加即可,同其他命令的参数)
位置参数变量的分类及作用
位置参数变量
作用
$n
n为数字,$0代表脚本本身, 1 − 9 代 表 第 一 到 第 九 个 参 数 , 第 十 以 上 参 数 用 大 括 号 包 含 , 第 十 个 : 1-9代表第一到第九个参数,第十以上参数用大括号包含,第十个: 1−9代表第一到第九个参数,第十以上参数用大括号包含,第十个:{10}
$*
表示命令行中的所有参数,$*将所有参数看作一个整体
$@
也表示命令行中的所有参数,$@将每个参数区分对待
$#
表示命令行中所有参数的个数
- 其中
$*
与$#
的作用乍一看相同,其实略有区分,相当于一个为总和,而一个为遍历集合,在下面的实验三中直观地展示了它们的具体区别
实验:
实验一:简单位置参数变量传入实验
#这是test1.sh脚本文件中的内容,有关脚本文件的创建和执行请移步我的另一篇博客 Bash Shell编程(一) #!/bin/bash
#参数变量脚本测试程序
echo $0 echo $1 echo $2 echo $#
执行test1.sh
并附加如下参数
zheng@Kali:~/Shell$ ./test1.sh Hello "I am Zheng"
./test1.sh # $0 脚本本身
Hello # $1 第一个参数
I am Zheng # $2 第二个参数(包含空格的字符串)
2 # $# 一共输入了两个参数
实验二:使用参数进行简单的加法运算
加法运算的内容暂时超纲,在下一节中会讲到
#这是test2.sh脚本文件的内容 #!/bin/bash
#加法运算的具体语法在后面讲到,必须用两个括号包含 sum=$(($1 + $2)) echo$sum
具体输出内容就不在这里呈现,如果输入两个数字,则会返回两个数字的和
实验三:展示参数
#@
与#*
的区别#这是test3.sh中的内容 #/bin/bash #区分$*与$@ #其中for为循环语句,在后面会讲到,与其他编程语言中的循环语句相同,类似 Python #本例仅作为了解两参数区别使用 x=1 echo '$*' for i in "$*" do echo "The parameter$x is $i" x=$(($x+1)) done x=1 echo '$@' for i in "$@" do echo "The parameter$x is $i" x=$(($x+1)) done
以如下参数执行
test3.sh
脚本,得到输出如下,zheng@Kali:~/Shell$ ./test3.sh 123 456 789 $* The parameter1 is 123 456 789 $@ The parameter1 is 123 The parameter2 is 456 The parameter3 is 789
可以清楚区分,
$*
表示的是参数总和,只有一个;而$@
表示的是各个独立参数组成的集合,可以遍历
预定义变量
预定义变量主要存放Shell执行状态相关的信息
预定义变量
变量作用
$?
最后一次执行的命令的返回状态,若正确运行则为0;错误退出,则由程序自己定义返回值(非0)
$$
当前进程的进程号(PID)
$!
最后一个被放入后台执行的进程号
- 预定义变量中的
$?
变量就是上一节多命令顺序逻辑符号中&&
逻辑与和||
逻辑或中命令是否成功执行的判断依据 - 在命令行后加
&
可以将命令放入后台执行,在后面会讲到
- 预定义变量中的
接收键盘输入给变量赋值
主要用read
命令实现
read [选项] [变量名]
选项
作用
-p “string”
显示提示信息
-t time (second)
指定等待时间(默认永久) ,等待时间结束自动结束输入
-n 字符数
接收指定的字符数后,程序就执行
-s
隐藏输入的数据,适合机密信息的输入
例如:
#以下为test4.sh文件中内容
#!/bin/bash
#read接收键盘输入示例
read -p "Please input your name: " -t 60 name
echo "Hello, $name!"
运行以下命令,提示输入姓名,输入后回车得到输出
zheng@Kali:~/Shell$ ./test4.sh
Please input your name: Zheng
Hello, Zheng!
结尾
下一节,我们将继续探索Bash变量相关内容,学习变量的数值运算与运算符、变量测试与内容替换、环境变量配置文件相关知识
输入示例
read -p "Please input your name: " -t 60 name
echo “Hello, $name!”
运行以下命令,提示输入姓名,输入后回车得到输出
```bash
zheng@Kali:~/Shell$ ./test4.sh
Please input your name: Zheng
Hello, Zheng!
结尾
下一节,Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件
我们将继续探索Bash变量相关内容,学习变量的数值运算与运算符、变量测试与内容替换、环境变量配置文件相关知识