shell(三)变量

简介: 使用shell编程,我们首先来了解一下shell的变量。Shell的变量大概分为以下几个类型:一:系统预定义变量Shell预定义了很多很多全局变量,类似:USER、PATH、HOME、LOGNAME、PWD我们在控制台使用这些变量的时候需要加上$ 实例如下:csharp复制代码[root@VM_0_4_centos ~]# echo $USERroot当然,还有其他的一些变量我这里没有展示,查看所有系统预定义的变量(全局变量)命令很简单:bash复制代码env结果如下图所示: 这部分系统预设的全局变量是在所有bash进程里边都是好用的。作用于是所有的bash进程。

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

一:系统预定义变量

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

USER、PATH、HOME、LOGNAME、PWD

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

csharp

复制代码

[root@VM_0_4_centos ~]# echo $USER
root

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

bash

复制代码

env

结果如下图所示:

image.png

这部分系统预设的全局变量是在所有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

结果如下图所示:

image.png

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

目录
相关文章
|
7月前
|
Shell Linux
|
7月前
|
Shell Python
python 和shell 变量互相传递
python 和shell 变量互相传递
70 0
|
7月前
|
Shell Linux
Linux下的Shell基础——变量、运算符、条件判断(二)
Linux下的Shell基础——变量、运算符、条件判断(二)
129 0
|
2月前
|
存储 Java Shell
Shell 变量
10月更文挑战第2天
28 0
|
3月前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
3月前
|
Java Shell Linux
Shell 变量设置
Shell设置变量
52 5
|
3月前
|
Java Shell Linux
Shell 变量设置25-1
Shell编程语言是一种非类型的解释型语言,无需像C++/Java那样事先声明变量。通过赋值即可定义变量,在Linux支持的所有Shell中均适用。变量分为局部变量与环境变量,前者仅限于定义脚本内使用,后者可在其派生的子进程中使用。常见系统变量如$0表示当前程序名称,$n表示第n个参数(n=1,2,...,9),$*代表所有参数,$#代表参数个数,$?表示命令执行后的状态(0为成功),$UID为当前用户ID,$PWD表示当前目录。定义变量如`A=123`,
33 0
|
4月前
|
Shell
[shell]在curl测试的data参数中引用变量
[shell]在curl测试的data参数中引用变量
244 1
|
5月前
|
分布式计算 大数据 Shell
MaxCompute产品使用合集之odps shell如何将ech变量的结果集合写入文件,并且指定服务器的位置
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
49 10
|
7月前
|
Shell Linux Perl
Linux|如何允许 awk 使用 Shell 变量
Linux|如何允许 awk 使用 Shell 变量
98 2