Shell变量:Shell变量的定义、赋值和删除-学习笔记

变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。例如在C语言或者 C++ 中,变量分为整数、小数、字符串、布尔等多种类型。

当然,如果有必要,你也可以使用 Shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。

定义变量

Shell 支持以下三种定义变量的方式:

variable=value
variable='value'
variable="value"

variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的。

注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样

Shell 变量的命名规范和大部分编程语言都一样:

  • 变量名由数字、字母、下划线组成;
  • 必须以字母或者下划线开头;
  • 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

变量定义举例:

a="hello"
echo $a
运行结果
hello

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

a="hello"
echo $a
echo ${a}

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

#!/bin/bash

a="bi"
echo "I have many ${a}cycles"

a="bi"
echo "I have many $acycles"

运行结果
I have many bicycles
I have many 

如果不给 skill 变量加花括号,写成echo "I have many $acycles",解释器就会把$acycles 当成一个变量(其值为空),代码执行结果就不对了。

推荐给所有变量加上花括号{ },这是个良好的编程习惯。

修改变量的值

已定义的变量,可以被重新赋值,如:

a="hello"
echo ${a}
a="bi"
echo ${a}

第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$

单引号和双引号的区别

前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:

#!/bin/bash
a="hello"
b1='print:$a'
b2="print:$a"
echo $b1
echo $b2

运行结果
print:$a
print:hello

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。

将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

例如,我在 当前目录中创建了一个名为 sample.try的文本文件。下面的代码中,使用 cat 命令将 sample.try 的内容读取出来,并赋值给一个变量,然后使用 echo 命令输出。

#主要介绍第二种方法,比较方便
result=$(cat sample.try)
echo $result
运行结果
name1 q2 q3 q4 q5 Chr1 2897 2890 294 75 Chr1 6344 6535 2092 48 Chr3 66067 6672 646 29 Chr4 12122 12154 233 48 Chr2 22727 22745 219 88 Chr2 28826 28375 250 2 Chr3 5290 52026 437 41 Chr4 8873 80929 387 148 Chr3 81093 81187 895 489

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash

a="hello"
readonly a
a="hello2"
运行结果
行 5: a:只读变量

删除变量

使用 unset 命令可以删除变量。语法:

变量被删除后不能再次使用;unset 命令不能删除只读变量。

#!/bin/bash

a="hello"
unset a
b="hi"
readonly b
unset b

运行结果
第 7 行: unset: b:无法取消设定: 只读 variable

参考:Shell变量:Shell变量的定义、赋值和删除

编辑于 2021-12-01 20:33