Bash 初学者系列 3:给 bash 脚本传递参数

系统 Linux
今天我们将介绍如何通过命令行将变量以参数的形式传递给 bash 脚本。

我们在上一篇文章中介绍了如何在 bash 脚本中使用变量​,可以响应各种数据以及接收用户输入。

今天我们将介绍如何通过命令行将变量以参数的形式传递给 bash 脚本。

向 bash 传递参数

下面脚本 count_lines.sh 将输出用户指定的文件的总行数:

#!/bin/bash
echo -n "Please enter a filename: "readnlines=$(wc -l < $filename)
echo "There are $nlines lines in $filename"

例如,用户可以输入文件 /etc/passwd,脚本将输出行数:

图片

脚本运行良好;然而,还有进一步优化的空间。

我们可以让用户在运行脚本时简单地将文件名作为命令行参数传递,而不是提示用户输入文件名,如下所示:

./count_lines.sh /etc/passwd

第一个 bash 参数(也称为位置参数)可以在 bash 脚本中使用 $1 访问。所以在 count_lines.sh 中,可以按如下方式将文件名变量替换为 $1:​

#!/bin/bash
nlines=$(wc -l < $1)echo "There are $nlines lines in $1"

我们去掉了第一个脚本中的 read 命令和第一个 echo 命令,这样脚本看起来更加简洁。

这样,在运行脚本的时候,可以将文件名作为参数传递:​

./count_lines.sh    /etc/groupThere are 73 lines in /etc/group

传递多个参数

可以一次性向 bash 脚本传递多个参数。通常情况下,以下是向脚本传递多个参数的语法:

script.sh arg1 arg2 arg3

第二个参数将由 $2 变量引用,第三个参数由 $3 引用,以此类推。

这里大家可能有一个疑惑,第一个变量是 $1,那么 $0 是用来做什么的呢?其实 $0 变量用于 bash 脚本的名称。

现在我们再来修改一下 count_lines.sh 脚本文件,以便其可以计算多个文件的行数,如下:​

#!/bin/bash
n1=$(wc -l < $1)n2=$(wc -l < $2)n3=$(wc -l < $3)
echo "There are $n1 lines in $1"echo "There are $n2 lines in $2"echo "There are $n3 lines in $3"

运行脚本,并传递三个文件作为参数:

图片

如上图所示,脚本输出了三个文件的行数;当然,有一点是不言而喻的,输出信息是依文件顺序的。

由 bash shell 中的参数想到的

Linux 有很多命令,其中有一些比较复杂,比如有很长的语法,或者很多的选项。不过我们可以通过使用 bash 参数,将那些很难的命令变为很简单的任务。

看如下 find.sh 脚本:​

#!/bin/bash
find / -iname $1

这是一个很简单但是很有用的脚本,提供文件名作为参数,脚本会打印出文件的位置:

图片

通过上图可以看到,这个脚本比单纯的使用 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 脚本:​

#!/bin/bash
echo "Name of the script: $0"echo "Total number of arguments: $#"echo "Values of all the arguments: $@"

然后提供几个参数运行脚本:

图片

责任编辑:庞桂玉 来源: TIAP
相关推荐

2022-12-13 12:55:15

Bash循环

2022-11-30 07:47:00

Bash脚本

2022-12-14 10:08:00

BashLinux

2022-12-02 14:30:24

Bash脚本数组

2022-12-09 07:58:52

Bash条件语句

2022-12-16 09:01:24

2022-12-08 12:05:03

Bash字符串

2022-11-28 08:01:47

BashLinuxshell 脚本

2022-12-07 07:43:21

2011-04-12 10:13:24

2011-07-04 14:14:54

java

2023-07-15 18:19:47

Bash参数

2018-04-24 11:09:13

LinuxShellfc

2018-05-14 08:53:51

Linux命令shuf

2018-04-08 14:47:06

Linux命令type

2010-05-12 17:36:44

MySQL初学者

2016-11-18 17:40:35

2009-11-13 15:46:25

Java多线程

2013-04-08 16:35:52

Adobe Edge

2011-06-17 14:41:56

Qt
点赞
收藏

51CTO技术栈公众号