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 $test1Hellozheng@Kali:~$ echo $test2Hello World!\\nI am Zhengzheng@Kali:~$ echo -e $test2 #test2变量值中包含转义符,需要用-e选项激活转义符Hello World!I am Zheng
-
变量叠加:在变量后追加一部分内容而前面部分不变,用括号与引号包含原变量并在后面写入追加内容,注意括号与引号的位置不同
#语法:追加内容以123为例test=\"$test\"123test=${test}123#示例:在变量test1上追加内容zheng@Kali:~$ test1=\"$test1\"\" World\" #追加的内容含有空格,故用引号包含zheng@Kali:~$ echo $test1Hello 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 $0echo $1echo $2echo $#
执行
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=1echo \'$*\'for i in \"$*\"doecho \"The parameter$x is $i\"x=$(($x+1))donex=1echo \'$@\'for i in \"$@\"doecho \"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 123The parameter2 is 456The 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 nameecho \"Hello, $name!\"
运行以下命令,提示输入姓名,输入后回车得到输出
zheng@Kali:~/Shell$ ./test4.shPlease input your name: ZhengHello, Zheng!
结尾
下一节,Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件
我们将继续探索Bash变量相关内容,学习变量的数值运算与运算符、变量测试与内容替换、环境变量配置文件相关知识
上一节,Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号