shell(三)变量

139 阅读2分钟

使用shell编程,我们首先来了解一下shell的变量。Shell的变量大概分为以下几个类型:

一:系统预定义变量

Shell预定义了很多很多全局变量,类似:

USER、PATH、HOME、LOGNAME、PWD

我们在控制台使用这些变量的时候需要加上$ 实例如下:

[root@VM_0_4_centos ~]# echo $USER
root

当然,还有其他的一些变量我这里没有展示,查看所有系统预定义的变量(全局变量)命令很简单:

env

结果如下图所示:

1.png

 

这部分系统预设的全局变量是在所有bash进程里边都是好用的。作用于是所有的bash进程。

 

二:用户自定义变量

我们在使用自定义变量的时候还是很简单的。语法如下:

Str=hello,world
[root@VM_0_4_centos ~]# Str=hello,world
[root@VM_0_4_centos ~]# echo $Str
hello,world

 

那我们定义的字符串中有空格怎么办呢?

Str=’hello world’
[root@VM_0_4_centos ~]# Str='hello world'
[root@VM_0_4_centos ~]# echo $Str
hello world

 

大概语法就是这个样子的,但是我们一定要注意,定义变量的等号左右是不能有空格的。我在其他语言中一般是这样写的。这样美观啊,但是shell编程是不行的。

Str = hello,world

上边的这种写法是不对的,切记切记。

 

三:全局变量、只读变量、撤销变量

1:全局变量

目前,我们这样定义的变量,他就是一个局部变量,只在当前的bash进程中好用。

那么我们如何将其变成一个全局变量呢?

很简单,我们需要使用到export命令。测试一下:

# 在当前bash中定义一个变量并输出:
[root@VM_0_4_centos ~]# Str='hello world'
[root@VM_0_4_centos ~]# echo $Str
hello world
# 将刚刚定义的变量变成全局变量
[root@VM_0_4_centos ~]# export Str
# 新开一个bash进程
[root@VM_0_4_centos ~]# bash
# 确认新开bash进程成功
[root@VM_0_4_centos ~]# ps -f | grep bash
root     27751 27749  0 14:32 pts/1    00:00:00 -bash
root     27837 27751  0 14:49 pts/1    00:00:00 bash
root     27881 27837  0 14:50 pts/1    00:00:00 grep --color=auto bash
# 在新开的bash进程中输出Str
[root@VM_0_4_centos ~]# echo $Str
hello world
# 退出新开的进程
[root@VM_0_4_centos ~]# exit
exit
# 在原有进程中再次输出Str
[root@VM_0_4_centos ~]# echo $Str
hello world

 

2:只读变量

只读变量定义就比较简单了,像上边的全局变量使用export一样,只读变量使用readonly

只读变量说白了就是常量呗。

[root@VM_0_4_centos ~]# readonly num=10
[root@VM_0_4_centos ~]# num=11
-bash: num: readonly variable

上面我们定义了只读变量num等于10,再去修改他的时候,bash告诉我们:他是一个只读变量不可修改。

 

3:撤销变量

在shell编程中,我们定义的一个变量现在我不想要他了,那么我们可以将其撤销。这里需要使用到命令unset

# 定义一个变量 Str
[root@VM_0_4_centos ~]# Str='hello world'
# 输出变量Str
[root@VM_0_4_centos ~]# echo $Str
hello world
# 撤销变量Str
[root@VM_0_4_centos ~]# unset Str
# 再次输出变量Str,发现其中内容已经空了
[root@VM_0_4_centos ~]# echo $Str
 
[root@VM_0_4_centos ~]#

 

那unset是否可以撤销我们上边定义的只读变量呢?

[root@VM_0_4_centos ~]# unset num
-bash: unset: num: cannot unsetreadonly variable

看样子,unset不能撤销只读变量。

 

四:特殊变量

1:$n

功能描述:n为数字,0代表该脚本名称,0代表该脚本名称,1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如S{10}

我们来测试一下:

我在she.sh文件中写入一下内容:

#! /bin/bash
echo $0
echo $1
echo $2

 

在控制台中执行这个.sh文件,传入参数one two,输出:

[root@VM_0_4_centos test]# ./she.sh one two
./she.sh
one
two

 

2:$#

获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性

我们接着使用上方的she.sh文件进行测试:

我在she.sh文件中写入一下内容:

#! /bin/bash
echo $0
echo $1
echo $2
echo $#

 

在控制台中执行这个.sh文件,传入参数one two,输出:

[root@VM_0_4_centos test]# ./she.sh one two
./she.sh
one
two
2

 

3:*、@

:这个变量代表命令行中所有的参数,*:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体

@:这个变量也代表命令行中所有的参数,不过@:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待,相当于是一个数组,可以使用for循环来遍历

我在she.sh文件中写入一下内容:

#! /bin/bash
echo $0
echo $1
echo $2
echo $#
echo $*
echo $@

 

在控制台中执行这个.sh文件,传入参数one two,输出:

[root@VM_0_4_centos test]# ./she.sh one two
./she.sh
one
two
2
one two
one two

 

4:$?

最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行:如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。

下边举个小例子:

[root@VM_0_4_centos test]# str=111
[root@VM_0_4_centos test]# echo $str
111
[root@VM_0_4_centos test]# echo $?
0

 

最后,发现了一个比较有意思的命令set,这个命令是用来查看,当前bash进程中定义的所有变量及函数的命令:

set

结果如下图所示:

2.png

有好的建议,请在下方输入你的评论。