shell(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feicongcong/article/details/84594481

脚本语言在定义变量时通常不需要指明类型,直接赋值就可以, shell 变量也遵循这个规则。

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

如果有必要,你也可以使用 declare 关键字显式定义变量的类型

定义变量

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

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

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

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

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

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

使用变量

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

author="hello" 
echo $author 
echo ${author}

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

skill="java"  
echo "I am good at ${skill}Script"

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出

将命令的结果赋值给变量

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

variable=`cat test.sh`
variable=$(cat test.sh)

echo $variable

只读变量

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

myUrl="baidu.com" 
readonly myUrl

删除变量

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

unset variable_name

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

Shell 变量的作用域可以分为三种:

  • 有的变量可以在当前 Shell 会话中使用,这叫做全局变量(global variable);在 Shell 中定义的变量,默认就是全局变量

全局变量的作用范围是当前的 Shell 会话,而不是当前的 Shell 脚本文件,它们是不同的概念。打开一个 Shell 窗口就创建了一个 Shell 会话,打开多个 Shell 窗口就创建了多个 Shell 会话,每个 Shell 会话都是独立的进程,拥有不同的进程 ID。在一个 Shell 会话中,可以执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效

  • 有的变量只能在函数内部使用,这叫做局部变量(local variable);

Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果

要想变量的作用域仅限于函数内部,那么可以在定义时加上local命令,此时该变量就成了局部变量

Shell 变量的这个特性和 JavaScript 中的变量是类似的。在 JavaScript 函数内部定义的变量,默认也是全局变量,只有加上var关键字,它才会变成局部变量。

  • 而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environment variable)。

全局变量只在当前 Shell 会话中有效,如果使用export命令将它导出,那么它就在所有的子 Shell 中也有效了,这称为“环境变量”

环境变量被创建时所处的 Shell 被称为父 Shell,如果在父 Shell 中再创建一个 Shell,则该 Shell 被称作子 Shell。当子 Shell 产生时,它会继承父 Shell 的环境变量为自己所用,所以说环境变量可从父 Shell 传给子 Shell。不难理解,环境变量还可以传递给孙 Shell

在一个 Shell 中创建子 Shell 最简单的方式是运行 bash 命令

$ a=22      #定义一个全局变量
$ echo $a    #在当前Shell中输出a,成功
22
$ bash    #进入子Shell
$ echo $a    #在子Shell中输出a,失败

$ exit    #退出子Shell
exit
$ export a    #将a导出为环境变量
$ bash    #重新进入子Shell
$ echo $a    #在子Shell中再次输出a,成功
22
$ exit    #退出子Shell
exit
$ exit    #退出父Shell,结束整个Shell会话

猜你喜欢

转载自blog.csdn.net/feicongcong/article/details/84594481