来自stdin的变量

时间:2012-02-27 18:11:46

标签: bash unix

我想使用read

从用户那里获得输入
read line

并且正确的输入将是一个字符串,然后是一个数字:

a 5
b 6
+ 87

你如何分开" a"和5成两个变量,用5变成一个整数变量?

4 个答案:

答案 0 :(得分:2)

read支持命令行选项-a,将输入存储在如下数组中:

$ read -a line
a 4
$ echo ${line[0]}
a
$ echo ${line[1]}
4

在我看来,这比使用两个变量更好。

答案 1 :(得分:0)

我建议您阅读read的文档,以帮助您入门:

help read

以下是前两段:

  

从标准输入中读取一行并将其拆分为字段。

     

从标准输入或文件描述符FD中读取单行       如果提供了-u选项。该行与单词一样分为字段       分裂,第一个单词分配给第一个NAME,第二个单词分配给第一个NAME       单词到第二个NAME,依此类推,分配给任何剩余的单词       最后一个名字。只有在$ IFS中找到的字符才会被识别为单词       分隔符。

请注意,bash没有与其他编程语言相当的“整数变量”概念。 Bash variables are untyped.使用declare -i将变量声明为整数只会影响对此变量的赋值 - 所有不是有效整数的内容都会静默设置为0

答案 2 :(得分:0)

我认为你在shell中操作,因为这篇文章被标记为“bash”,但你可能想要明确这一点。

无论如何,shell的“read”命令需要多个变量名,而不只是一个。你可以给它两个,它会在相应的变量中将每个单词交给你。 (它们在IFS变量给出的字段分隔符上拆分。)

在一般情况下,shell在“整数”变量和任何其他类型之间没有任何区别。

如果您真的想了解如何正确编写shell脚本,我建议您完全阅读shell的手册页。

答案 3 :(得分:0)

read命令会将您的输入与$IFS中的任何内容分开。默认情况下,这是空格,所以只需这样做:

read my_string my_number

会将您的输入拆分为由空格分隔的两个部分。有时候,你会看到这个:

read my_string my_number garbage

因为无论你有多少参数,read都会将整行的其余部分读入最后一个变量。例如,如果我有:

read my_string my_number

用户输入:

this 1 foo foo foo!

$my_string将为this,但$my_number将为1 foo foo foo!

通过添加另一个变量(在这种情况下称为garbage),我消除了这个问题。如果我把:

read my_string my_number garbage

用户输入:

this 1 foo foo foo!

$my_string将为this$my_number将为1$garbage将为foo foo foo!

一个简单的测试程序:

while read my_string my_number garbage
do
  echo "The string is '$my_string'. The number is '$my_number'."
  echo "Note there's no error checking of input."
  echo "That's your job, Bunky."
done