如果输入文件有更多输入,则循环 shell 脚本

如果输入文件有更多输入,则循环 shell 脚本

我有一个 shell 脚本,并且我已通过answers.txt 文件提供了该脚本的答案。

echo -n "Enter your name: "; read name
echo -n "Enter your number: "; read number
echo "Your name is $name and your number is $number"

答案.txt 文件

Buvanesh
12345

我使用运行这个脚本script.sh < answers.txt

应答文件是动态的,意味着用户可以在应答文件中添加更多名称和号码。

例如

Buvanesh
12345
Kanna
45678

在这种情况下,如果我运行脚本,它将只需要前两个输入。我想获取 shell 脚本的所有输入并相应地给出输出。我想我必须实现一个循环,但我不知道在这种情况下到底如何实现。谁能帮我这个?

答案1

while IFS= read -r name && IFS= read -r number; do
   #IFS= read -r number || break
   printf 'Your name is %s and your number is %d\n' "$name" "$number"
done < answers.txt

你的思维过程是正确的,我们需要引入一个循环loopwhile其条件是read由 AND 连接的命令。

答案2

read当没有更多输入时该命令将失败,因此您可以将其用作循环条件:

#!/bin/sh
echo -n "Enter your name: "
while read name
do
  echo -n "Enter your number: "
  read number
  echo "Your name is $name and your number is $number"
done

答案3

夏勒先生的回答很好。从文件重定向输入的缺点是,您的手动输入现在也受到循环的影响,因此用户必须知道按 Enter 键(而不是提供值)才能结束循环。您可以使用当前的逻辑进行手动运行,并在向脚本提供输入文件 ($1)(未重定向)时执行如下操作。

如果您确信文件的格式始终为“name\nnumber\n”,那么您可以执行以下操作:

cntr=0
cat $1 | while read line
do
    if [ $cntr -eq 0 ]
    then
      name=$line
      cntr=1
    elif [ $cntr -eq 1 ]
      number=$line
      echo "Your name is $name and your number is $number"
      cntr=0
    fi
done

这应该打印您的声明,直到读取所有姓名/号码组合。

相关内容