在 Bash 中读取文件或用户输入

Muhammad Husnain 2023年1月30日 2022年6月15日
  1. BASH 脚本
  2. 从 Bash 脚本中的 stdin 输入
  3. Bash 文件输入
在 Bash 中读取文件或用户输入

BASH 是 Bourne Again Shell 的简写,这是一个智能名称,指的是 Bourne Shell(即由 Steven Bourne 创建)。BASH 是由 Brian Fox 开发的一个 shell 程序,是 Bourne Shell 应用程序 sh 的更新版本。

本文将讨论 bash 脚本中的输入功能以及从标准输入控制台和一些特定文件获取输入的方法。此外,我们还将通过多个示例脚本来说明这个想法。

BASH 脚本

包含我们通常会在命令行中输入的指令列表的纯文本文件称为 Bash Shell 脚本。当要重复执行一系列任务时,Bash 特别有用。

无需每次都输入相同序列的指令手册,只需执行一个预先编写的 Bash 脚本文件即可。因此,这节省了大量的人工工作,也节省了时间。

Bash 脚本的另一个优点是它的命令式编程特性。这意味着它允许编写程序、条件语句和循环结构,如编程语言(例如,C/C++、Javascript 等)。

Bash 脚本是一个带有 .sh 扩展名的文本文件。为了创建它,我们使用扩展名为 .shtouch 命令。

touch myscript.sh

我们可以在任何文本编辑器中打开它,例如 gedit。要打开它,请使用以下命令。

命令:

gedit myscipt.sh

我们使用 #!/bin/bash 行来启动一个 shell 脚本。在这一行 #!一部分称为 shebang,其余部分是操作系统中 bash 解释器的路径。

之后,我们将在脚本中编写所需的命令集并保存。要运行 Bash 脚本,我们使用命令 bash

命令:

bash myscript.sh

这将运行我们的脚本并为我们提供脚本中使用的命令的输出。

从 Bash 脚本中的 stdin 输入

我们还可以从终端或 Bash 脚本中的 stdin 获取用户输入。我们可以使用内置的 Bash 命令 read 来读取 Bash 用户输入。

它接受用户的输入并将其分配给一个变量。它只能从 Bash shell 中读取一行。

语法:

read <variable>

每个以空格分隔的单词都保存在不同的变量中。

Bash 脚本示例:

#!/bin/bash
echo "Enter your name: "
read userName
echo "Enter your age: "
read userAge;
echo "Enter your 3 Subjects: "
read sub1 sub2 sub3
echo "The user $userName is $userAge years old and is specialized in $sub1, $sub2, and $sub3. "

在此示例中,我们从用户那里获取了他的姓名、年龄和 3 个主题的输入。主题保存在单独的变量中。

输出:

从 Bash shell 中只读取一行

使用 read 命令提供变量名称不是强制性的。如果我们不指定变量名,它默认将值存储在 REPLY 变量中,以便我们稍后在脚本中使用它。

Bash 脚本示例:

#!/bin/bash
echo "Enter a number from 1-10: "
read
echo "You entered: $REPLY"

输出:

默认情况下将值存储在 REPLY 变量中

在前面的示例中,我们使用了 2 行来获取输入,一行用于提示语句,另一行用于读取命令。这个过程也可以使用带有 read 命令的标志 -p 在单行中执行。

语法:

read -p <Prompt statement> <variable_name>

巴赫脚本示例:

#!/bin/bash
read -p "Please enter the name of the file: " fileName
echo "The filename you entered is: $fileName"

输出:

在 read 命令中使用标志 -p

在某些情况下,出于安全和隐私方面的考虑,我们需要从屏幕上隐藏用户输入。例如,当我们需要输入密码时,当用户输入密码时,它不应该在屏幕上可见。

为了实现它,我们使用标志 -s 来使其静默。

Bash 脚本示例:

#!/bin/bash
read -p "Enter username: " userName
read -sp "Enter Password: " pass
echo
echo "Hello $userName"

输出:

使用标志 -s 使密码输入在屏幕上不可见

我们还可以使用 -a 标志将输入输入到数组中。使用此标志,一行中的所有单词都将存储在数组的不同索引中,以便以后访问。

Bash 脚本示例:

#!/bin/bash
echo "Enter names of 2 students: "
read -a stuNames
echo "The names of students are:${stuNames[0]}, ${stuNames[1]} "

输出:

使用 -a 标志在数组中获取用户输入

Bash 文件输入

Bash 脚本也可以从文件中获取输入。read 命令用于此目的并逐行读取文件。我们将讨论一些从文件中读取数据的示例。

我们可以使用控制台和脚本来读取文件。首先,我们查看控制台命令,然后转向脚本。

假设我们有一个文件 data.txt,其中包含一些文本,如下所示:

LG
Samsung
Bosch
Pel

读取此文件的命令:

while read ln; do echo $ln; done < data.txt

输出:

在 BASH 中读取 .txt 文件

我们还可以使用脚本从文件中读取。

Bash 脚本示例:

#!/bin/bash
fname='data.txt'
a=1
while read ln; do
echo "Reading line $a : $ln"
a=$((a+1))
done < $fname

输出:

使用脚本从文件中读取

我们也可以从命令行读取文件名。创建一个 bash 文件并将下面的脚本放入其中。

文件名将从该脚本的命令行输入中获取。变量 $1 将保存文件名以供读取,读取第一个参数值。

如果文件存在于当前位置,while 循环将逐行读取文件并打印内容,就像前面的示例一样。

Bash 脚本示例:

#!/bin/bash
fname=$1
while read ln; do
echo $ln
done < $fname

要运行此脚本,我们将使用以下命令。

命令:

$ bash myscript.sh data.txt

输出:

从命令行读取文件名

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

相关文章 - Bash Input