使用shell编程,我们首先来了解一下shell的变量。Shell的变量大概分为以下几个类型:
一:系统预定义变量
Shell预定义了很多很多全局变量,类似:
USER、PATH、HOME、LOGNAME、PWD
我们在控制台使用这些变量的时候需要加上$ 实例如下:
csharp
复制代码
[root@VM_0_4_centos ~]# echo $USER root
当然,还有其他的一些变量我这里没有展示,查看所有系统预定义的变量(全局变量)命令很简单:
bash
复制代码
env
结果如下图所示:
这部分系统预设的全局变量是在所有bash进程里边都是好用的。作用于是所有的bash进程。
二:用户自定义变量
我们在使用自定义变量的时候还是很简单的。语法如下:
ini
复制代码
Str=hello,world [root@VM_0_4_centos ~]# Str=hello,world [root@VM_0_4_centos ~]# echo $Str hello,world
那我们定义的字符串中有空格怎么办呢?
ini
复制代码
Str=’hello world’ [root@VM_0_4_centos ~]# Str='hello world' [root@VM_0_4_centos ~]# echo $Str hello world
大概语法就是这个样子的,但是我们一定要注意,定义变量的等号左右是不能有空格的。我在其他语言中一般是这样写的。这样美观啊,但是shell编程是不行的。
ini
复制代码
Str = hello,world
上边的这种写法是不对的,切记切记。
三:全局变量、只读变量、撤销变量
1:全局变量
目前,我们这样定义的变量,他就是一个局部变量,只在当前的bash进程中好用。
那么我们如何将其变成一个全局变量呢?
很简单,我们需要使用到export命令。测试一下:
ini
复制代码
# 在当前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
只读变量说白了就是常量呗。
csharp
复制代码
[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
csharp
复制代码
# 定义一个变量 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是否可以撤销我们上边定义的只读变量呢?
bash
复制代码
[root@VM_0_4_centos ~]# unset num -bash: unset: num: cannot unset: readonly variable
看样子,unset不能撤销只读变量。
四:特殊变量
1:$n
功能描述:n为数字,0代表该脚本名称,0代表该脚本名称,0代表该脚本名称,1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如S{10}
我们来测试一下:
我在she.sh文件中写入一下内容:
bash
复制代码
#! /bin/bash echo $0 echo $1 echo $2
在控制台中执行这个.sh文件,传入参数one two,输出:
bash
复制代码
[root@VM_0_4_centos test]# ./she.sh one two ./she.sh one two
2:$#
获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性
我们接着使用上方的she.sh文件进行测试:
我在she.sh文件中写入一下内容:
bash
复制代码
#! /bin/bash echo $0 echo $1 echo $2 echo $#
在控制台中执行这个.sh文件,传入参数one two,输出:
bash
复制代码
[root@VM_0_4_centos test]# ./she.sh one two ./she.sh one two 2
3:∗、*、∗、@
∗:这个变量代表命令行中所有的参数,*:这个变量代表命令行中所有的参数,∗:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体
@:这个变量也代表命令行中所有的参数,不过@:这个变量也代表命令行中所有的参数,不过@:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待,相当于是一个数组,可以使用for循环来遍历
我在she.sh文件中写入一下内容:
bash
复制代码
#! /bin/bash echo $0 echo $1 echo $2 echo $# echo $* echo $@
在控制台中执行这个.sh文件,传入参数one two,输出:
sql
复制代码
[root@VM_0_4_centos test]# ./she.sh one two ./she.sh one two 2 one two one two
4:$?
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行:如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
下边举个小例子:
bash
复制代码
[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
结果如下图所示:
有好的建议,请在下方输入你的评论。