Linux Bash Shell编程(四):变量(上) 变量分类与相关操做
上一节,咱们了解了Bash中的重定向以及特殊符号,从本节开始咱们来一块儿探索Bash中变量的奥秘。本节咱们先来了解下Bash中变量的基本知识以及对变量处理的操做方法。本节的部份内容(特殊符号等)在上一节中有叙述,不清楚的同窗能够参阅上一节内容。shell
变量概述
变量是计算机内存单元,其中存放的值能够变化,Shell脚本将信息存放在变量中,变量有一个名字,能够方便地引用,能够保存设置,也能够保存临时信息编程
Bash变量设置规则
- Bash中的变量能够由字母、数字、下划线构成,但不能以数字开头
- Bash变量的默认类型是字符串型,若是要进行数值运算,则必须指定变量类型为数值型或使用特殊运算方法
- 在对变量赋值时,若变量值字符串中有空格,须要将整个值用引号包括,类同上一节
- 使用echo命令输出变量值时,Shell一样对变量值进行当场转义,若在其中使用转义符
\
请使用-e
参数激活转义 - 环境变量名一般为大写,用户声明环境变量时也建议大写,以便于区分
变量分类
- 用户自定义变量
- 环境变量:主要保存和系统操做环境相关变量,环境变量不能更名,但能新建
- 位置参数变量:主要用来向脚本中传递参数或数据,变量名不能自定义,变量做用是固定的
- 预约义变量:是Bash中已经定义好的变量,变量名不能自定义,变量做用也固定(位置参数变量也是预约义变量的一种)
变量分类介绍与操做
不一样种类的变量操做大致相同,相同部分在用户自定义变量操做中写出,后面再也不赘述数组
用户自定义变量
-
用户自定义变量由用户自由定义修改,通常变量名能够修改,也可删除,在不违反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
-
变量叠加:在变量后追加一部份内容而前面部分不变,用括号与引号包含原变量并在后面写入追加内容,注意括号与引号的位置不一样url
#语法:追加内容以123为例 test="$test"123 test=${test}123 #示例:在变量test1上追加内容 zheng@Kali:~$ test1="$test1"" World" #追加的内容含有空格,故用引号包含 zheng@Kali:~$ echo $test1 Hello World
-
另外,使用
set
命令能够查看当前定义的全部变量和函数(不仅是用户自定义变量)spa -
删除变量:
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变量相关内容,学习变量的数值运算与运算符、变量测试与内容替换、环境变量配置文件相关知识