Shell - 从每行获取用户的输入

时间:2017-05-01 06:20:54

标签: arrays bash shell unix

我试图将用户的输入转换为数组,但Shell接受用间隔分隔的用户输入。有没有办法接受每行单独给出的用户输入。我的代码如下:

#!/bin/bash
echo "enter the servers names..."
read -a array
for i in "${array[@]}"
do
echo $i
done
exit 0

输入:

hello world

我希望输入如下(在两个不同的行中):

hello
world

请帮助。感谢。

3 个答案:

答案 0 :(得分:1)

您可以指定read的分隔符来停止阅读,而不是换行符。 (read man page

  

-d delim继续,直到读取DELIM的第一个字符为止               比新线

例如:
read -d':' -a array

如果你想要没有输入的分隔符,可以使用循环读入数组的元素,然后检查输入是否为空字符串。

i=0
read "array[$i]"
while [ "${array[$i]}" ];
do
    let "i = i+1"
    read "array[$i]"
done

所以输入将是

hello
world
# > there is one more empty line

答案 1 :(得分:1)

根据帮助阅读:

  

从标准输入或文件描述符FD ...

中读取单行

这个循环会改为:

echo "enter the servers names..."
i=0
until false; do
  read server
  [ -z "$server" ] && break
  let i=i+1
  array[$i]="$server"
done

for i in "${array[@]}"; do
  echo $i
done
exit 0

循环将退出空行或EOF(ctrl-D)。

示例会话以空行终止:

  

@server:/ tmp $ ./test.sh
  输入服务器名称...
  SE1
  SE2
  se3

     

SE1
  SE2
  se3

在se2之后空行上的EOF终止示例会话:

  

@server:/ tmp $ ./test.sh
  输入服务器名称...
  SE1
  SE2
  SE1
  se2

请注意,我在阅读名称时检查空字符串;但是可以在任何循环中检查空字符串(或其他任何内容),例如在打印它们或进行其他计算时。

答案 2 :(得分:-1)

#!/bin/bash
echo "enter the servers names..."
read -a array -d '\n'
for i in "${array[@]}"
do
echo $i
done
exit 0

#!/bin/bash
echo "enter the servers names..."
readarray array
for i in "${array[@]}"
do
echo $i
done
exit 0