Bash是一种相当强大的编程语言,也很容易上手。这里有一些鲜为人知但很有用的bash命令,它们将有助于使您编写的 shell 脚本更清晰、更易于维护。毕竟,它几乎是您打开终端时最经常看到的shell。

Bash中有一些您可能不知道的强大命令,即使您对该语言的使用相当熟练。但是,这些命令都是非常目的性,并且可以使您编写的 shell 脚本更清晰、更易于维护,并且比以前更强大。

在本教程中,我们将说明如何使用read,mapfile,source命令在bash脚本中的实际应用。我们举例一些常见的例子,希望能对有所帮助。

read命令询问用户的输入

read命令允许脚本接受用户输入,并将输入存储在变量中。

#!/usr/bin/env bash
echo "What is your name?"
read name
echo "Your name is ${name}!"

这将等待用户的输入,然后将name变量的值设置为用户输入的字符串。

例如,如果您在运行上述脚本时指定myfreax.com为你的姓名,它将输出Your name is myfreax.com

您还可以通过-pread命令指定选项来使上面的示例更加优雅,该选项将打印在 之后指定的字符串-p,然后要求用户输入:

#!/usr/bin/env bash
read -p "What is your name? " name
echo "Your name is ${name}!"

您还会注意到我在What is your name?之后添加了一个空格。如果我们不添加它,这会让用户在输入时看起来更奇怪。

mapfile命令将文件的行转换Bash数组

您可以使用mapfile命令读取文件的内容,然后将输出分配给Bash数组,只要在文件中遇到换行符,就会创建一个数组元素。

例如,我们创建一个名为的文件file.txt,其中包含以下文本:

Line 1
Line 2
Line 3
Line 4
Line 5

您可以通过运行以下命令将此文件转换为Bash 数组,该命令将文件的内容分配给file_var变量:

#!/usr/bin/env bash
mapfile file_var < file.txt

for i in "${file_var[@]}"; do
	echo "${i}"
done

您会注意到上面的内容也会产生一些奇怪的间隔输出,这些输出与文件内的内容不一致,这可以通过向命令添加-t选项来解决:

#!/usr/bin/env bash
mapfile -t file_var < file.txt

for i in "${file_var[@]}"; do
	echo "${i}"
done

最后,您可能会注意到以下内容不起作用:

#!/usr/bin/env bash
cat file.txt | mapfile -t file_var

这是因为mapfile管道右侧的命令是在子shell执行的。换句话说,是在一个新的Bash实例中运行的,它无法影响您当前的shell。

source命令将文件中的变量导入shell的环境变量中

假设您有以下虚构文件config.sh其内容如下:

username=myfreax
domain=myfreax.com

如果您想获取该文件的内容并将其放入当前shell的环境变量中,这可以通过使用 source命令非常简单地完成:

source config.sh

然后,您可以检查变量是否按预期分配。source命令实际上在当前shell的环境中运行指定的文件,因此在该文件中的任何命令都会被执行.

例如,让我们将以下内容放入config.sh

name="myfreax"
echo "Hello ${name}!"
echo "Have a good day!"

然后,如果我们运行soure config.sh,您将看到两个echo命令得到运行,以及name变量被分配:您也可以使用.代替source,其作用与此相同source

结论

你学习如何使用read命令询问用户的输入。如何使用mapfile命令将文件的行转换Bash数组。如何source命令将文件中的变量导入shell的环境变量中。也知道source命令的别名. 。如果您有任何疑问或反馈,请随时在下面评论。