shell 变量

变量允许你临时性地将信息存储在shell脚本中,以便和脚本中的其他命令一起使用。

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

在Bash shell中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。这意味着,Bash shell在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串

1、变量定义

变量定义方式有三种

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

shell定义字符串变量时字符串可以用单引号,也可以用双引号,也可以不用引号,如果无特殊情况话,三者效果一样
注意:·
1、赋值号=的周围不能有空格
2、如果value不包含任何空白符(例如空格、Tab等),那么可以不使用引号;如果value包含了空白符,就必须用引号包围起来
3、使用单引号和使用双引号也是有区别的:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    单引号字串中不能出现单引号(对单引号使用转义符后也不行)
	双引号里可以有变量,允许变量替换
    双引号里可以出现转义字符

1.1Shell变量的命名规范:

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

1.2删除变量

2 shell 变量的作用域

  1. 有的变量可以在当前 Shell 会话中使用,这叫做全局变量(global variable);
  2. 有的变量只能在函数内部使用,这叫做局部变量(local variable);
  3. 而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environment variable)。

2.1、全局变量

全局变量的作用范围是当前的 Shell 会话,而不是当前的 Shell 脚本文件,它们是不同的概念。

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

2.2、局部变量

Shell 也支持自定义函数,但是 Shell 函数和 C/C++、Java 等其他编程语言函数的一个不同点就是:在Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果

#!/bin/bash
 
#定义函数
function func(){
a=99
}
 
#调用函数
func
 
#输出函数内部的变量
echo $a

a 是在函数内部定义的,但是在函数外部也可以得到它的值,证明它的作用域是全局的,而不是仅限于函数内部。

#!/bin/bash
 
#定义函数
function func(){
local a=99
}
 
#调用函数
func
 
#输出函数内部的变量
echo $a

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

2.3、环境变量

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

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

export a这种形式是在定义变量 a 以后再将它导出为环境变量,如果想在定义的同时导出为环境变量,可以写作export a=22。

注意:环境变量只能向下传递而不能向上传递,即“传子不传父”。

3、变量的使用

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

#!/bin/bash
author="kane"
echo $author
echo ${author}

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

#!/bin/bash
skill="Java"
echo "I am a good ${skill}script"			
echo "I am a good $skillscript"

4、命令替换

shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋
给变量之后,就可以随意在脚本中使用了。

有两种方法可以将命令输出赋给变量:
1. 反引号字符(`)

[root@wcl ~]# testing=`date`
[root@wcl ~]# echo "date&time:"$testing
date&time:2018年 05月 10日 星期四 10:33:10 CST

2. $()格式

[root@wcl ~]# test2=$(date)
[root@wcl ~]# echo "今天的时间是:"$test2
今天的时间是:2018年 05月 10日 星期四 10:37:40 CST