变量
shell变量命名规则和和大部分编程语言都一样:
- 变量名有数字、字母、下划线组成;
- 必须以字母或下划线开头,不能以数字开头;
- 不能使用shell所保留的关键字(通过help命令可以查看保留的关键字)
注意,赋值号“=
”的周围不能有空格。
定义并使用变量
设置变量“name”:name=“张王李赵”
使用echo输出:echo $name
注意如果拼接字符串
- 单引号:echo ‘你好$name’ 结果是:你好$name
- 双引号:echo “你好$name” 结果是:你好张王李赵
以单引号' '
包围变量的值时,单引号里面是什么就输出什么(适合纯文本)
以双引号" "
包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。
建议:变量使用是用{}包起来,可以读性提高,并准确解释变量,如下:
skil="java"
echo "I am good at $skillScript"
解释器就会把 $skillScript 当成一个变量(其值为空)。结果为:I am good at
echo "I am good at ${skill}Script"
就可以准确的执行。结果为:I am good at javaScript
设置只读变量(readonly)
readonly skil
设置过以后再变更skil的值会报错,但可以正常使用
删除变量(unset)
unset skil
变量被删除后不能再次使用;unset 命令不能删除只读变量。
变量作用域(分为三种)
- 在当前 Shell 会话中使用,这叫做全局变量(global variable)默认;
- 在函数内部使用,这叫做局部变量(local variable);
- 在其它 Shell 中也使用,这叫做环境变量(environment variable)。
全局变量演示(global variable)
定义a.sh 文件
#!/bin/bash
echo $a
b=200
定义 b.sh文件
#!/bin/bash
echo $b
执行
打开一个 Shell 窗口,输入以下命令:
将a设置为99,执行a.sh和b.sh,结果如下
$ a=99
$ . ./a.sh
99
$ . b.sh
200
$
a.sh显示a的值:99;设置b的值为200
b.sh显示b的值:200
可以发现,在 Shell 会话中以命令行的形式定义的变量 a,在 a.sh 中有效;在 a.sh 中定义的变量 b,在 b.sh 中也有效。因此全局变量的作用范围是当前的 Shell 会话
局部变量(local variable)
[root@centos shell]# function fun1(){
> local a=1
> b=2
> echo "fun1(a):${a}"
> echo "fun1(b):${b}"
> }
[root@centos shell]# fun1
fun1(a):1
fun1(b):2
[root@centos shell]# echo ${a}
[root@centos shell]# echo ${b}
2
如上图:在fun1函数里定义一个全局变量b=2,局部变量a=1,并打印
调用fun1函数是a、b均可打印
直接调用a和b时,只有b(全局可正常打印)正常打印,a打印为空
局部变量值限于定义范围,如上,在fun1函数定义,就只有fun1函数可以使用
环境变量(environment variable)
[root@centos shell]# a=100
[root@centos shell]# echo ${a}
100
[root@centos shell]# bash
[root@centos shell]# echo ${a}
[root@centos shell]# exit
exit
[root@centos shell]# export a
[root@centos shell]# echo ${a}
100
[root@centos shell]# bash
[root@centos shell]# echo ${a}
100
export:将变量导出为环境变量;bash:是进入子shell;exit推放回上一级的shell;
如上脚本:设置过a以后打印正常,进入子shell后,打印为空(非环境变量),退出到父shell后将a导出为环境变量,在进入子shell,打印a,可以正常打印
如果想在定义的同时导出为环境变量,可以写作export a=200
注意,环境变量只能向下传递而不能向上传递,即“传子不传父”。