前言
上一篇文章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 中的变量分类:自定义变量、环境变量、位置参数变量和预定义变量,并详细介绍了后两种:
- 位置参数变量的使用,以及引导用户键盘输入;
- 预定义变量的使用。
更多
微信公众号:CodePlayer