使用shell编程,我们首先来了解一下shell的变量。Shell的变量大概分为以下几个类型:
一:系统预定义变量
Shell预定义了很多很多全局变量,类似:
USER、PATH、HOME、LOGNAME、PWD
我们在控制台使用这些变量的时候需要加上$ 实例如下:
[root@VM_0_4_centos ~]# echo $USER
root
当然,还有其他的一些变量我这里没有展示,查看所有系统预定义的变量(全局变量)命令很简单:
env
结果如下图所示:
这部分系统预设的全局变量是在所有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 unset: readonly variable
看样子,unset不能撤销只读变量。
四:特殊变量
1:$n
功能描述:n为数字,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
结果如下图所示:
有好的建议,请在下方输入你的评论。