我们在上一篇文章中介绍了如何在 bash 脚本中使用变量,可以响应各种数据以及接收用户输入。
今天我们将介绍如何通过命令行将变量以参数的形式传递给 bash 脚本。
向 bash 传递参数
下面脚本 count_lines.sh 将输出用户指定的文件的总行数:
例如,用户可以输入文件 /etc/passwd,脚本将输出行数:
脚本运行良好;然而,还有进一步优化的空间。
我们可以让用户在运行脚本时简单地将文件名作为命令行参数传递,而不是提示用户输入文件名,如下所示:
第一个 bash 参数(也称为位置参数)可以在 bash 脚本中使用 $1 访问。所以在 count_lines.sh 中,可以按如下方式将文件名变量替换为 $1:
我们去掉了第一个脚本中的 read 命令和第一个 echo 命令,这样脚本看起来更加简洁。
这样,在运行脚本的时候,可以将文件名作为参数传递:
传递多个参数
可以一次性向 bash 脚本传递多个参数。通常情况下,以下是向脚本传递多个参数的语法:
第二个参数将由 $2 变量引用,第三个参数由 $3 引用,以此类推。
这里大家可能有一个疑惑,第一个变量是 $1,那么 $0 是用来做什么的呢?其实 $0 变量用于 bash 脚本的名称。
现在我们再来修改一下 count_lines.sh 脚本文件,以便其可以计算多个文件的行数,如下:
运行脚本,并传递三个文件作为参数:
如上图所示,脚本输出了三个文件的行数;当然,有一点是不言而喻的,输出信息是依文件顺序的。
由 bash shell 中的参数想到的
Linux 有很多命令,其中有一些比较复杂,比如有很长的语法,或者很多的选项。不过我们可以通过使用 bash 参数,将那些很难的命令变为很简单的任务。
看如下 find.sh 脚本:
这是一个很简单但是很有用的脚本,提供文件名作为参数,脚本会打印出文件的位置:
通过上图可以看到,这个脚本比单纯的使用 find 命令要简单的多。这就说明了可以使用参数将 Linux 中比较复杂的命令转为比较简单的 bash 脚本。
上述脚本中的 2> /dev/null,是指将报错信息重定向到 /dev/null,也就是不打印报错信息。大家可参考:
Linux 中如何将输出和错误重定向到 /dev/null
bash shell 中的特殊变量
bash 中有很多内置的特殊变量,使用非常方便。如下是最常见的:
变量 | 描述 |
$0 | bash 脚本的名称 |
$1, $2...$n | bash 脚本的参数 |
$$ | 当前 shell 的进程 ID |
$# | 传递给脚本的参数总数 |
$@ | 传递给脚本的所有参数的值 |
$? | 上一个执行命令的退出状态 |
$! | 上次执行命令的进程 ID |
大家可以实际查看一下这些特殊变量,参考如下 variables.sh 脚本:
然后提供几个参数运行脚本: