开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情
前言
到目前为止我们编写的脚本都缺乏一项在大多数计算机程序中都很常见的功能-交互性。
也就是,程序与用户进行交互的能力。虽然许多程序不必是可交互的,但一些程序却得到益处,能够直接接受用户的输入。
以这个前面章节中的脚本为例:
#!/bin/bash
# test-integer2: evaluate the value of an integer.
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
if [ $INT -eq 0 ]; then
echo "INT is zero."
else
if [ $INT -lt 0 ]; then
echo "INT is negative."
else
echo "INT is positive."
fi
if [ $((INT % 2)) -eq 0 ]; then
echo "INT is even."
else
echo "INT is odd."
fi
fi
else
echo "INT is not an integer." >&2
exit 1
fi
一、读取键盘输入
1.1 read – 从标准输入读取数值
这个 read 内部命令被用来从标准输入读取单行数据。
这个命令可以用来读取键盘输入,当使用重定向的时候,读取文件中的一行数据。这个命令有以下语法形式:
read [-options] [variable...]
这里的 options 是下面列出的可用选项中的一个或多个,且 variable 是用来存储输入数值的一个或多个变量名。如果没有提供变量名,shell 变量 REPLY 会包含数据行。
基本上,read 会把来自标准输入的字段赋值给具体的变量。如果我们修改我们的整数求值脚本,让其使用 read,它可能看起来像这样:
#!/bin/bash
# read-integer: evaluate the value of an integer.
echo -n "Please enter an integer -> "
read int
if [[ "$int" =~ ^-?[0-9]+$ ]]; then
if [ $int -eq 0 ]; then
echo "$int is zero."
else
if [ $int -lt 0 ]; then
echo "$int is negative."
else
echo "$int is positive."
fi
if [ $((int % 2)) -eq 0 ]; then
echo "$int is even."
else
echo "$int is odd."
fi
fi
else
echo "Input value is not an integer." >&2
exit 1
fi
``
我们使用带有 -n 选项(其会删除输出结果末尾的换行符)的 echo 命令,来显示提示信息,然后使用 read 来读入变量 int 的数值。运行这个脚本得到以下输出:`
```bash
[me@linuxbox ~]$ read-integer
Please enter an integer -> 5
5 is positive.
5 is odd
read 可以给多个变量赋值,正如下面脚本中所示:
#!/bin/bash
# read-multiple: read multiple values from keyboard
echo -n "Enter one or more values > "
read var1 var2 var3 var4 var5
echo "var1 = '$var1'"
echo "var2 = '$var2'"
echo "var3 = '$var3'"
echo "var4 = '$var4'"
echo "var5 = '$var5'"
在这个脚本中,我们给五个变量赋值并显示其结果。注意当给定不同个数的数值后,read怎样操作:
[me@linuxbox ~]$ read-multiple
Enter one or more values > a b c d e
var1 = 'a'
var2 = 'b'
var3 = 'c'
var4 = 'd'
var5 = 'e'
[me@linuxbox ~]$ read-multiple
Enter one or more values > a
var1 = 'a'
var2 = ''
var3 = ''
var4 = ''
var5 = ''
[me@linuxbox ~]$ read-multiple
Enter one or more values > a b c d e f g
var1 = 'a'
var2 = 'b'
var3 = 'c'
var4 = 'd'
var5 = 'e f g'
如果 read 命令接受到变量值数目少于期望的数字,那么额外的变量值为空,而多余的输入数据则会被包含到最后一个变量中。
如果 read 命令之后没有列出变量名,则一个 shell 变量,REPLY,将会包含所有的输入:
#!/bin/bash
# read-single: read multiple values into default variable
echo -n "Enter one or more values > "
read
echo "REPLY = '$REPLY'"
这个脚本的输出结果是:
[me@linuxbox ~]$ read-single
Enter one or more values > a b c d
REPLY = 'a b c d'
选项
read 支持以下选送:
1.2 校正输入
从键盘输入这种新技能,带来了额外的编程挑战,校正输入。很多时候,一个良好编写的程序与一个拙劣程序之间的区别就是程序处理意外的能力。通常,意外会以错误输入的形式出现。在前面章节中的计算程序,我们已经这样做了一点儿,我们检查整数值,甄别空值和非数字字符。每次程序接受输入的时候,执行这类的程序检查非常重要,为的是避免无效数据。对于由多个用户共享的程序,这个尤为重要。如果一个程序只使用一次且只被作者用来执行一些特殊任务,那么为了经济利益而忽略这些保护措施,可能会被原谅。即使这样,如果程序执行危险任务,比如说删除文件,所以最好包含数据校正,以防万一。
1.3 菜单
一种常见的交互类型称为菜单驱动。在菜单驱动程序中,呈现给用户一系列选择,并要求用户选择一项。例如,我们可以想象一个展示以下信息的程序:
Please Select:
1.Display System Information
2.Display Disk Space
3.Display Home Space Utilization
0.Quit
Enter selection [0-3] >
总结
在这一章中,我们向着程序交互性迈出了第一步;允许用户通过键盘向程序输入数据。使用目前已经学过的技巧,有可能编写许多有用的程序,比如说特定的计算程序和容易使用的命令行工具前端。在下一章中,我们将继续建立菜单驱动程序概念,让它更完善。