前言
当我第一次编写shell脚本程序时,写了一个国际惯例:hello world
于是我在一个文件中,写下一行代码,创建1个变量,赋值为Hello World,保存代码如下:
my_first = hello world
当我满心欢喜的运行,bash给我一个大大的错误:(文件已给予可执行权限,chmod +x 文件名)
./third_shell.sh: line 1: my_first: command not found
我懵逼了……,心想:shell脚本程序怎么回事?定义个变量直接拉跨了?心中一万个尼玛已经奔腾起来了……我相信你也遇见过……,当时的我没有系统学习过shell编程,只有使用的时候,查查资料,随着需求的复杂以及使用率的提高,总是碰见各种奇怪问题,我终于明白:我必须系统的、完整的学习shell编程的所有知识点,这才有了这一系列文章的想法,希望能对你们有所帮助。
第一篇:变量,将会涉及以下知识点:
1、shell变量如何创建(定义)、修改、读取
2、echo命令的基本使用
3、参数的概念
4、环境变量
5、特殊变量名
我们第一篇不会讲太多关于变量的知识点,免得过剩,这些主要知识点绝对够大家消化一阵子了,让我们开始吧……
创建变量的3种方式(定义变量)
my_hero=hello
my_pig='world'
my_first="hello world"
echo $my_first
创建变量与定义变量,其实是一个意思,一个偏口语化、另一个则偏术语化,读计算机的书多了,你就有深刻的理解了,我现在是彻底理解了~~~卷不倦~~~
上面的代码已经展示了3种创建变量的方式,分别是
1、没有引号:my_hero=hello
2、单引号:my_hero='hello'
3、双引号:my_hero="hello"
学过别的语言的同学,自然以为''与""一样,更不敢相信原来不用引号也能创建字符串,shell编程中有自己的标准,它没有引号也能创建字符串,并且''与""也是不同的方式,创建的字符串在解析的时候也所区别!
创建变量的通用规则
1、变量名
位于=的左侧,称为变量名,my_hero为变量名
my_hero=hello
2、变量值
位于=的右侧,称为变量值,也称字面量值,hello就是变量值
my_hero=hello
3、=两侧要紧紧的抱在一起
这也是多数同学不适应shell语法的最大吐槽点,这是shell编程的标准
=的两边不能有任何的空白字符(空格字符、制表符、换行符),必须要my_first=hello
变量名、变量值必须和=紧紧的挨在一起写
(备注:请慢慢习惯……因为bash解释器通过空白字符区分命令与参数,也称作单词分割)
my_hero=hello
4、无需声明变量类型
在shell编程中,变量值的类型都是字符串,没有其他类型,比如整型、浮点型等等这些都没有,只有字符串类型,比如a=5,数字5也是字符串
a=5
5、单词分割
由于bash通过空白字符(空格、换行、制表)进行单词分割,假设变量值本身包含空白字符(空格字符、换行符、制表符),此时必须使用单引号或者双引号圈起来使其成为一个整体,因为单引号与双引号会使单词分隔功能失效!比如a="wang yuan wai",此时由于单词分隔功能失效,"wang yuan wai"成为一个整体,有空格字符时,只能用下面两种
a="wang yuan wai"
a='wang yuan wai'
为什么创建变量时,等号两边不能有空白字符?(空格字符、制表符、换行符)
first = hello #错误
second=world #正确
我要着重强调这点区别,不单单要吐槽它。因为shell解释器对命令行解析时,使用空白字符对【命令】与【参数】进行区分(使用空白字符对单词进行分割)!这段话现在不明白没关系,有个概念就行,以后还会不断出现在你的脑子里……接下来再简单介绍一个术语:命令行!
空白字符:空格字符、换行符、制表符,三者统称为空白字符(术语)
什么是命令行?
first=hello #我是命令行
echo hello #我也是命令行
在一行中写下的所有字符,直到遇见最后的换行符,这称为一个命令行!中文翻译都是根据英文直译过来的, 觉得怪怪的也正常,毕竟它的英文名为Command Line,Command表示命令、Line表示行
英文简称:CMD
英文全称:Command Line
中文名称:命令行
变量名的命名规则
变量名不能随便写啊,我们遵守标准即可
my_baby="hello"
1、字母(大小写)、数字和下划线组成,其它字符一律不行!
2、第一个字符必须是一个字母或一个下划线,不能是数字
单引号与双引号创建的区别(重点)
my_first=hello
my_first='hello'
my_first="hello"
以下是三者的一些区别
1、无任何修饰符
无法包含空白字符,字符得连接在一起
2、单引号
所有特殊字符无效,单词分割功能失效,可以包含空白字符
3、双引号
变量值替换、命令替换、转义字符、数学计算,4种方式shell解释器可以解释,其它特殊字符一律无效
特殊字符等术语现在不明白,以后可以回头再过来看这段知识
唯一数据类型:字符串
first=1
second=2
third=3
再强调一遍,尽管变量值是数字,但它们在shell中也是字符串,因为在shell编程中,唯一的数据类型为字符串 ,也可以说shell编程中没有数据类型的概念
同一行创建多个变量
my_first="hello world";my_second="bei jing"
echo $my_first
echo $my_second
在同一行创建多个变量,需要使用分号";"隔离开多个变量名即可. ;还有另外一个作用,用来间隔命令,比如echo hello;echo baby。 此时执行了两次echo命令!接下来我们了解一下echo
echo命令
echo hello
学习shell编程,离不开echo命令,echo命令的特点是,传给echo的参数,它都会原样的将传入的参数再输出到标准输出中,比如上面给echo命令传入的是参数是hello,则在屏幕中就能看到hello字样,默认的标准输出是屏幕!
标准输出:代表屏幕,文件描述符为1,暂时记住就可以了!
创建一个保存其它变量名的变量
my_first="hello world"
my_second=my_first
echo $my_first
echo $my_second
这种语法是允许的,第一个变量my_first的变量值是字符串值hello world,第二个变量my_second的变量值是my_first,my_first是一个变量
输出结果:
$ ./third_shell.sh
hello world
my_first
变量的重复赋值
my_world=tiger
my_world=dog
后面的赋值会覆盖掉前面最初的赋值,这与所有的语言都一样,嘿嘿
全局变量
以下代码,my_world与second均为全局变量
my_world=tiger
function test(){
second=my_girl
}
1、shell脚本顶层代码中
2、shell脚本定义的函数中没有任何修饰的变量
都是全局变量
创建局部变量
function fk(){
local temp=hello
echo $temp
}
使用local命令,可以在shell的函数中创建局部变量,否则创建的是全局变量
读取变量值的2种写法
temp=hello
echo $temp
echo ${temp}
1、$变量名
2、${变量}
两种写法都可以,第一种是第二种写法的简写形式($变量名是${变量名}的简写形式),建议平时使用第二种方式,后面你会知道原因
读取变量值可以出现在命令行的任意位置中(重要)
temp=hello
today=man${temp}
second="nihao${temp}"
形容读取变量值的另外两个术语是
1、变量替换
2、变量值替换
bash解释器读取命令行时,会优先执行变量值替换,还有字符串拼接,最后才去执行命令
second="nihao${temp}"
bash解释器会先将${temp}替换为hello,然后将拼接好的字符串nihaohello赋值给新的变量名second
删除变量值
first=hello
unset first
#或者
first=
或者
first=''
3种方式,任选其一即可
环境变量
export first=hello
#或者
first=hello
export first
使用export命令输出的环境变量,作为系统级别变量,可以让其它程序,不限于shell脚本,都可以访问到这个环境变量值
常见的环境变量
HOME 用户主目录路径
PATH 命令搜索的所有目录
IFS 默认分隔符
LINENO 脚本的行号
HOST 当前主机名称
BASHPID 当前bash进程的pid
PWD 当前用户的工作目录
RANDOM 返回0-32767之间的一个随机数
更多的环境变量介绍请使用env命令查看
特殊变量名
bash中内置了很多特殊变量名,每个变量名都有其作用
?
$
_
0
1
2
3
!
? 表示上一条命令的退出状态码(可执行程序)
$ 表示当前bash进程的pid
_ 表示上一个命令的最后一个参数
0 表示当前脚本的名称
1 表示传入的第一个位置参数
2 表示传入的第二个位置参数
3 表示传入的第三个位置参数
! 表示最近执行的子进程的pid
总结
1、shell编程中的变量,有自己的规范,本篇作为引导文,没有覆盖所有变量的知识
2、特殊变量名,等你用的多了就熟悉了,举个例子: ${!},!本身是个特殊变量名,而不是$!为变量名,美元字符的作用是变量值替换
3、shell编程值得系统学习