0%

Shell脚本基础之变量使用、echo 命令、exit命令

这里介绍shell脚本中关于变量的使用方式及常用的echo、exit命令

abstract.png

变量使用

创建如下的shell脚本文件Var.sh。其是一个关于shell脚本中变量使用的Demo。其中,我们需要在脚本的第一行指定解释器信息。用于告知系统该脚本使用什么解释器进行执行。语法为 #!解释器的路径信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/local/bin/zsh
# 变量使用的示例脚本

# 赋值变量: 等号=两侧不能有空格
my_age=18
# 变量的值中包含空格,必须使用引号将其括起来
my_name="Aaron Zhu"

# 赋值变量:命令替换。将命令的执行结果赋值给变量
# 方式1 反引号``
today=`date`
# 方式2 $()
chars_num=$(date | wc -m)
echo "today is $today. chars num is $chars_num"

# 引用变量:使用$美元符号
msg="My name is $my_name"
echo $msg
# 变量可以再次赋值
# 花括号{}是可选的。加花括号是为了帮助解释器识别、界定$后的变量名边界
msg="My age is ${my_age}"
echo $msg

# 只读变量
title=DemoTest
author=Tony
# 将title、author设置为只读变量,后续不可以再次进行赋值修改
readonly title author
echo "read only var : title is ${title}, author is ${author}"
# 定义为只读变量后,执行下述两行将报错
# author=Tom
# title=1

# 可以在设置为只读变量的同时,完成初始化
readonly test_version=12.3.0 test_person=Bob
echo "Test Info: Version is ${test_version}, Person is ${test_person}"

# 删除变量
unset my_age
echo "After delete var my_age, value is ${my_age}"
# 变量被删除后,可以重新赋值使用
my_age=996
echo "My age is ${my_age}"

# 只读变量不允许被删除,执行下述代码将报错
# unset title

# 将变量值作为脚本的退出状态码
exit ${my_age}

执行Var.sh脚本也很简单,首先为其添加执行权限x。然后在脚本文件所在的目录下,通过 ./Var.sh 即可执行。需要注意的是,不能通过Var.sh来执行。原因很简单,因为Linux系统会去PATH路径下寻找Var.sh。而显然脚本文件所在的目录并不在PATH路径中。故通过Var.sh执行会提示找不到命令。而使用 ./Var.sh 的方式进行执行,则告诉系统就在当前目录下寻找

figure 1.png

echo 命令

该命令可以打印内容。对于内容而言,无论是否使用双引号进行包裹均可以

1
2
3
4
5
# 打印内容
echo Hello Aaron

# 打印内容
echo "Hello Aaron"

figure 2.png

打印引号

在对内容使用双引号进行包裹的前提下,如果期望打印双引号,则需要添加转义符反斜杠\进行转义;如果期望打印单引号,可直接打印无需转义

1
2
3
# 对打印内容中的双引号添加反斜杠进行转义
# 对打印内容中的单引号直接打印即可
echo "He say \"I'll do my best\"."

在对内容未使用引号进行包裹的前提下,如果期望打印双引号、单引号,都需要添加转义符反斜杠\进行转义

1
2
# 对打印内容中的双引号、单引号,都要添加反斜杠进行转义
echo He say \"I\'ll do my best\".

figure 3.png

打印变量

打印变量时,如果只是期望打印变量名本身,而不是打印变量的值。同样可在$前添加转义符反斜杠\实现

1
2
3
echo "The value of Var PWD is $PWD."

echo "The value of Var \$PWD is $PWD."

figure 4.png

换行

echo命令默认会在末尾添加换行符。可通过-n选项取消末尾的换行符

1
2
3
4
5
6
7
echo "Hello," ; echo "Aaron." ; echo "Welcome to ..."

echo -n "Hello," ; echo "Aaron." ; echo "Welcome to ..."

echo "Hello," ; echo -n "Aaron." ; echo "Welcome to ..."

echo -n "Hello," ; echo -n "Aaron." ; echo "Welcome to ..."

figure 5.png

exit命令

Linux中专门提供了一个变量 $? 用来保存最后一个已执行命令的退出状态码。其值的范围为[0,255]。具体地,对于成功结束的命令而言,其退出状态码为0;对于错误结束的命令,其退出状态码非0

figure 6.png

通过exit命令,则可以在退出当前shell进程/当前shell脚本的同时,返回指定的退出状态码。下图,我们先启动了一个子Shell,然后再执行exit命令。否则当前Shell退出后,终端的窗口会被关闭。无法观察到输出结果

1
2
3
4
5
6
7
# 以 指定退出状态码 退出 当前shell进程 / 当前shell脚本
exit [退出状态码]

# 退出 当前shell进程 / 当前shell脚本
# 同时,将 此前最后一条命令的退出状态码 作为 exit命令的退出状态码
# 本质上,相当于 exit $?
exit

figure 7.png

对于shell脚本而言,其退出状态码是脚本中的最后一个命令的退出状态码。故我们可以在shell脚本中使用exit命令。此时就可以在退出脚本同时,返回指定的退出状态码。需要注意的是如果指定的退出状态码值大于255的话,则最终返回的值是shell对其按256取模后的结果。例如上面脚本指定的退出返回码是996,经取模后返回 996%256 = 228

figure 8.png

Note

事实上,我们在执行脚本时,还可以选择将脚本文件作为参数传递给解释器的方式进行运行。此时,不仅无需在脚本文件第一行指定解释器信息(写了也没用),而且也无需给该脚本添加x执行权限。下图中,我们直接在脚本文件第一行指定了错误的解释器信息,结果也不会影响它的运行。进一步证明了其不会被使用

figure 9.png

参考文献

  1. Linux命令行与shell脚本编程大全·第4版 Richard Blum、Christine Bresnahan著
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝