Linux学习之shell脚本——变量

时间:2021-12-02 02:38:50

echo:显示内容

在学习变量之前先了解一个命令echo,该命令类似于c中的print,在控制台打印消息。

输入echo Hello World命令,结果如下

[root@iZ2zebizp6le568407aeayZ shell]# echo Hello World
Hello World

在这里,echo实际上接收了两个参数HelloWorld并显示。

输入echo 'Hello world'命令,

[root@iZ2zebizp6le568407aeayZ shell]# echo 'Hello World'
Hello World

打印虽然一样,但此时echo只接收了一个参数。

可以分别在两条命令的HelloWorld中间添加多个空格,以此验证。

定义变量

输入命令vim variable.sh然后编写脚本内容如下

#!/bin/bash

# 定义变量
message='Hello world'

# 打印变量
echo $message

在定义变量时,我们不需要添加$符号,但要使用此变量,一定要添加$符号。

然后保存该脚本文件并添加执行权限。关于创建、保存和添加权限的细节,如果不了解的请看我上一篇博客

运行脚本./variable.sh,结果如下:

[root@iZ2zebizp6le568407aeayZ shell]# ./variable.sh
Hello world

注意:在编写的过程中,一些有着格式化习惯的人会在=两边添加空格,如下message = 'xxx',但在实际运行过程中会将message当做命令去执行,报如下错误

[root@iZ2zebizp6le568407aeayZ shell]# ./variable.sh 
./variable.sh: line 4: message: command not found

引号的使用

在上面的程序中,编写时使用了'单引号,修改脚本程序如下:

#!/bin/bash

# 定义变量
message='Hello world'

# 打印变量
echo 'message is $message'

修改了echo打印的内容,变量的引用放到了'单引号中,此时运行脚本,结果如下

[root@iZ2zebizp6le568407aeayZ shell]# ./variable.sh 
message is $message

What?变量为什么没有被替换呢?

因为在shell中,单引号忽略它括起来的所有特殊符号,也就是说此时的$仅仅表示一个字符,没有什么特殊的含义。

遇到这种情况怎么办呢,可以使用双引号替换单引号,因为双引号虽然也忽略大部分的特殊字符,但不包括美元符号$、反引号和反斜杠\。不忽略美元符号意味着变量可以被识别。那么修改代码如下

#!/bin/bash

# 定义变量
message='Hello world'

# 打印变量
echo "message is $message"

运行结果如下:

[root@iZ2zebizp6le568407aeayZ shell]# ./variable.sh 
message is Hello world

除了双引号和单引号,还有反引号,如何使用呢,我们继续修改代码

#!/bin/bash

# 定义变量
message='Hello world'

# 打印变量
echo "message is $message"

# 获取目录,反引号括起
dir=`pwd`

# 打印
echo “dir:$dir

又定义了一个变量并赋值,其中值用反引号括住,最后打印一下。运行结果如下

[root@iZ2zebizp6le568407aeayZ shell]# ./variable.sh 
message is Hello world
dir:/home/shell”

可以看到使用反括号括起来的值被当做命令去执行,并将执行的值赋给变量。

read 请求输入

既然是程序,肯定就会有输入的情况,那么如何获取用户输入呢?

运行vim read_variable.sh并添加内容

#!/bin/bash

read name

echo "Hello $name"

添加权限后运行./read_variable.sh命令,结果如下

[root@iZ2zebizp6le568407aeayZ shell]# ./read_variable.sh 
111
Hello 111

当程序运行之后,会等待,直到我们输入并敲击回车之后,才往下执行。

如果传入多个参数呢,修改脚本如下:

#!/bin/bash

read name password

echo "Hello $name --- $password"

运行脚本结果如下:

[root@iZ2zebizp6le568407aeayZ shell]# ./read_variable.sh 
1321 dadas das312
Hello 1321 --- dadas das312

对于一条read命令,获取的参数以空格分割,上面的输入中输入了三个参数,那么多余的参数会累加到最后一个参数上

read命令同时提供了一些常用的参数:

  • -p:显示提示信息。
  • -n:限制字符的数目。如果输入的参数的字符数目已经达到限制的字符数,则会自动往下执行。
  • -t:限制输入的时间,单位s。当达到时间之后,会自动执行命令。
  • -s:隐藏输入,类似于常见的Linux输入密码的样式。

举个例子:

编写如下代码:

#!/bin/bash

read -p '请输入姓名(最大字符5):' -n 5 -t 5 name

echo "Hello !"

read命令分别添加了提示输出的信息,字符的限制,以及限制输入时间。

执行的如下:

[root@iZ2zebizp6le568407aeayZ shell]# ./read_variable.sh 
请输入姓名(最大字符5):dsHello !

输入了ds之后,并没有键入回车,程序等待5s之后继续执行,不过没有换行,我们可以在echo中加入\n

到了这里,会发现我们输入的参数必须要根据提示一个个的输入,那么我们能不能在使用脚本的时候,直接在后面拼接上参数呢,当然是可以的。

看如下代码:

#!/bin/bash

echo "参数的数目:$#"

echo "运行脚本的名称:$0"

echo "第一个参数:$1"

echo "第二个参数:$2"

代码中结束的很清楚,如果想要获取第3,4,5…,依次往下累加即可。

运行一下代码:

[root@iZ2zebizp6le568407aeayZ shell]# ./variable_porams.sh one two three
参数的数目:3
运行脚本的名称:./variable_porams.sh
第一个参数:one
第二个参数:two

数组

shell中的数组的使用基本上和一些脚本语言使用上类似。

首先看代码:

#!/bin/bash

array=('0' '1' '2')
array[5]='5'
echo ${array[1]}
# 打印所有数组
echo ${array[*]}

数组的声明用()括起来。数组可以包含任意大小的元素数目,而且数组的元素编号不需要是连续的,可以略过一些格子。

注意:shell中数组的下标也是从0开始

运行一下脚本:

[root@iZ2zebizp6le568407aeayZ shell]# ./variable_array.sh 
1
0 1 2 5