Bash 脚本——读取用户输入
在本文中,我们将讨论如何在 BASH 中读取用户输入。
基本用户输入
我们可以简单地从 BASH 中的读取命令获取用户输入。它提供了许多选项和参数以实现更灵活的使用,但我们将在接下来的几节中介绍它们。现在,让我们看看如何使用基本的读取命令。
#!usr/bin/env bash
read name
echo "Hello, $name"
因此,在上述脚本中,“#!/usr/bin/env bash”是指示解释器在 BASH 环境中运行脚本的 shebang运算符。我们使用了 read 命令来获取用户输入的变量名。 echo 命令是一个可选命令,仅用于验证我们是否已将输入存储在 name 变量中。我们在变量命令前面使用 $ 来获取和解析变量的字面量。
读取命令参数
读取命令提供了许多可以传递给它的参数,以便以灵活的方式获取用户输入。这里讨论了少数几个论点中的一些:
- 提示字符串 (-p)
- 密码输入 (-s)
- 更改分隔符 (IFS)
- 解析为数组 (-a)
- 限制输入长度 (-n)
- 定时输入 (-t)
提示字符串
使用这个参数,我们可以在输入之前提示一个字符串。这允许用户在读取命令之前无需使用 echo 就可以了解要输入的内容。让我们看一下提示字符串到读取命令的参数的演示。
#!usr/bin/env bash
read -p "Enter your name : " name
echo "Hello, $name"
从演示中,我们可以看到在用户输入之前有一个字符串提示,因为我们在输入变量之前使用了“-p”参数,这给了变量之前的字符串一个参数。这允许更好的界面和程序的可读性。我们可以说这种内置的回显功能是在带有字符串提示的读取命令中。
密码输入
现在假设我们要在输入中输入密码,以及在用户输入时显示它是多么不安全。好吧,我们有解决方案。我们可以使用 -s 参数来静默来自用户输入的回声。这允许以安全的方式使用读取命令。
#!usr/bin/env bash
read -sp "Enter your password : " pswd
echo -e "\nYour password is $pswd"
在上面的演示中,输入是静音的,即界面不打印用户正在输入的内容。但是我们可以看到我输入了 12345 并且稍后从变量中存储和检索。您可以注意到我们将参数-s和-p嵌套为-sp以一起使用这两个参数。此外,echo 命令被修改,因为我们使用-e参数来使用格式化字符串,即使用“ \n ”和字符串中的其他特殊字符。
更改分隔符
使用这个参数,我们可以改变我们为变量分配值的方式,即如果我们想使用单个读取命令获得多个输入,我们可以使用空格分隔的值来做到这一点。
#!usr/bin/env bash
read -p "Enter name age and country : " name age country
echo "Name : $name"
echo "Age : $age"
echo "Country : $country"
从上面的示例中,我们可以看到它巧妙地将变量分配给提供的值。你可以看到最后一个变量有 3 个空格,所以因为它是最后一个输入,所以它为自己分配了所有内容,但如果它不是最后一个输入,它可能会弄乱格式。
如果我们提供了四个输入,那么“United”这个词将是国家变量,其余的东西在最后一个变量中。我们在这里对分隔符有了一些了解,分隔符是用于区分不同实体集的模式或字符,在我们的例子中是输入变量。我们可以更改分隔符,默认情况下,我们在读取命令中有空格作为分隔符。让我们看看我们如何实现这一目标。
#!usr/bin/env bash
IFS="," read -p "Enter name, age, city and country : " name age city country
echo "Name : $name"
echo "Age : $age"
echo "City : $city"
echo "Country : $country"
在以下示例中,我们使用了IFS 或内部字段分隔符。我们在读取命令的开头将IFS 设置为“,” 。如您所见,这不会将空格计为变量赋值中的分隔符。这会根据需要导致正确和格式化的输入,您可以选择 IFS 作为内部输入中未使用的字符,否则它会按预期使格式迷失方向。我们可以将 IFS 用作“ . “、” 、 “、” / “、” \ “。 “ ; “等,因为这在输入中不常用,它还取决于您要实现的目标。
解析为数组
我们可以一次将输入直接解析为一个数组。我们可以指定 -a 参数来做同样的事情。这将创建一个元素并为数组元素分配输入值。让我们看看演示。
#!usr/bin/env bash
read -a array -p "Enter the elements of array : "
for n in ${array[*]};
do
echo "$n"
done
在此示例中,我们将值输入到数组变量,它是一个列表/数组。该名称可以是与您的程序相关的任何内容。此处的分隔符默认为上述空格,您可以使用读取命令开头的 IFS 参数来格式化输入,如上一节所述。但在这里为了演示,我将其默认为空格。我们可以添加参数 - a 以将输入附加到紧随其后提供的数组中。我们可以通过遍历数组来验证读取命令是否有效并存储了所有元素。
为了简单起见,我们可以使用基于范围的 for 循环并打印数组中每个元素的值。我们可以使用“ {} ”来标识变量, [*] 表示数组中的所有元素,我们将迭代器设为“n” ,我们在每次迭代后打印值。因此,在输出中,我们能够获得数组的所有元素。我们甚至可以使用“[@]”而不是“[*]”,因为它会以稍微不同的方式遍历数组,但目的相同。
限制输入的长度
我们甚至可以在读取命令中限制输入的长度。如果我们希望用户通过某些输入限制来限制用户,我们可以使用 -n 参数来做到这一点。
#!usr/bin/env bash
read -n 6 -p "Enter the name : " name
echo -e "\nName : $name"
在上面的演示中,我们可以看到即使我没有按回车/回车/换行,在输入中输入第 6 个字符后命令停止。因此,这可用于通过一些敏感输入(如用户名、密码等)来限制用户。我们输入参数-n后跟我们要限制的字符数。
定时输入
这样做是为了以时间受限的方式从用户输入。我们可以将参数指定为 -t 以及我们要等待的秒数,直到退出输入提示。
#!usr/bin/env bash
read -p "Enter the name : " -t 8 name
echo -e "\nName : $name"
因此,我们可以看到提示等待了 8 秒,但我们没有按 Enter,因此它返回时没有输入脚本中的进一步指令(如果有的话)。我们可以传入-t参数来设置超时,然后是等待用户输入所需值的秒数。