前言

上一篇文章Bash 中的变量类型,你知道几种?,我们一起学习了 Bash 中自定义变量和环境变量的使用,本篇文章来学习后面两种:位置参数变量和预定义变量。

变量分类

我们先来复习下 Bash 中的四种变量类型:

  • 自定义变量:类似Java、Go语言中的自定义变量,灵活性最高;
  • 环境变量:主要保存和系统环境相关的变量,系统已经定义好了很多环境变量,同时允许用户新增自定义环境变量,灵活性较高;
  • 位置参数变量:这种变量主要是用来向脚本中传递参数或者数据用的,参数名不能自定义,变量的作用也是固定的,只能更改值;
  • 预定义变量:Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

位置参数变量

这种变量主要是用于执行脚本时,向脚本传递参数:

位置参数变量 作用
$n n为数字,$0代表命令本身,$1到$9代表第1到9个参数,10以上的参数需要用大括号包含,例如${10}
$* 这个变量代表命令中的所有参数,$* 把所有的参数看作一个整体,即一个字符串
$@ 这个变量代表命令中的所有参数,每个参数都看作独立的,可以想象为一个list
$# 代表命令行参数个数

我们来写个脚本实际体验下,就容易理解了:

 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
[root@VM-0-5-centos ~]# vim test.sh

#!/bin/bash
echo "param count:  $#"

# 将输入的两个参数相加后输出
num1=$1
num2=$2
sum=$((num1+num2))
echo "num1: $num1"
echo "num2: $num2"
echo "sum: $sum"

# 体验 $* 和 $@ 的区别
echo 'all params of $*' $*
echo 'all params of $@' $@
for i in "$*"
        do
                echo '$* param:' "$i"
        done

for i in "$@"
        do
                echo '$@ param:' "$i"
        done



[root@VM-0-5-centos ~]# chmod 755 test.sh
[root@VM-0-5-centos ~]# ./test.sh 1 2
param count:  2
num1: 1
num2: 2
sum: 3
all params of $* 1 2
all params of $@ 1 2
$* param: 1 2
$@ param: 1
$@ param: 2

在实际使用中,我们很少使用位置参数变量进行逻辑处理,因为用户使用脚本时并不知道脚本需要几个参数,只有编写者才知道。最佳实践,更多的是引导用户输入参数,然后进行处理。

接收键盘输入

1
2
3
4
5
6
7
8
# read [选项] [变量名]

选项:

-p "提示信息":在等待输入时,输出提示信息
-t 秒数:指定等待时间
-n 字符数:read只接收固定长度的字符数,到达长度就执行
-s:隐藏输入的数据,适用于密码输入

测试接收键盘输入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@VM-0-5-centos ~]# vim read.sh

#!/bin/bash

read -t 30 -p "please input your username: " username
echo "username is $username"

read -s -t 30 -p "please input your password: " password
echo "password is $password"
echo -e "\n"

read -n 1 -t 30 -p "Please select your gender [M/F]: " gender
echo "Gender is: $gender"


[root@VM-0-5-centos ~]# chmod 755 read.sh
[root@VM-0-5-centos ~]# ./read.sh
please input your username: lifelmy
username is lifelmy
please input your password: password is 123456


Please select your gender [M/F]: MGender is: M

预定义变量

预定义变量 作用
$? 最后一次命令执行命令的返回状态。变量值为0,表示上个变量正确执行;非0表示上个命令执行失败(具体什么非0值由命令自己决定)
$$ 当前的进程号
$! 后台运行的最后一个进程的进程号

还记得我们之前学习过的 多命令执行 吗,那里的 &&|| 命令,就是使用 $? 来判断上一条命令是否正确执行的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[root@VM-0-5-centos ~]# echo "hello"
hello
# 上一条命令正确执行,输出0
[root@VM-0-5-centos ~]# echo $?   
0
[root@VM-0-5-centos ~]# sfadf
-bash: sfadf: 未找到命令
# 上一条命令错误执行,输出非0值
[root@VM-0-5-centos ~]# echo $?
127

测试 $$$! :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[root@VM-0-5-centos ~]# vim process.sh

#!/bin/bash

echo "current process id is $$"

# 最后加一个&,表示 把查找命令放到后台执行
find /root -name "hello.sh" &

echo "last process id is $!"

# 测试 $$ 和 $!
[root@VM-0-5-centos ~]# ./process.sh
current process id is 24230
last process id is 24231

[root@VM-0-5-centos ~]# /root/hello.sh

总结

本篇文章首先回顾了 Bash 中的变量分类:自定义变量、环境变量、位置参数变量和预定义变量,并详细介绍了后两种:

  1. 位置参数变量的使用,以及引导用户键盘输入;
  2. 预定义变量的使用。

更多

微信公众号:CodePlayer