Shell编程基础(第1篇:变量)

前言

    当我第一次编写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编程值得系统学习

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值