【问题标题】:Shell - Taking the input from the user from each lineShell - 从每一行获取用户的输入
【发布时间】:2017-05-01 06:20:54
【问题描述】:

我正在尝试将用户的输入输入到一个数组中,但 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

请帮助。谢谢。

【问题讨论】:

  • read 之前设置 IFS=$'\n' 以仅在换行符处换行。 (您可以保存旧值,例如(oldIFS=IFS 在更改它之前,在循环之后恢复原来的IFS=oldIFS - 这里不需要,因为您只是exit
  • 你的意思是这样 - IFS=$'\n' read -a array ?
  • 听起来你想对输入进行预处理。尝试tr -s ' ' '\n' | read -a ...,并注意这将使变量仅在管道创建的子shell 中可用。这也将为您处理空行(除非该空行位于输入的开头)。

标签: arrays bash shell unix


【解决方案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

【讨论】:

  • 谢谢,但我的输入中没有任何分隔符。它们只是一个单词,应该在每一行中给出
  • 这段代码运行良好。但是那个空行很麻烦,因为它正在接受输入
  • 到目前为止,我不知道如何处理另外一个空行...或者您可以输入EOF(ctrl-d)。
【解决方案2】:

根据帮助阅读:

从标准输入或文件描述符 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

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

【讨论】:

    【解决方案3】:
    #!/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
    

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      相关资源
      最近更新 更多