我有一个 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
你的思维过程是正确的,我们需要引入一个循环loop
,while
其条件是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
这应该打印您的声明,直到读取所有姓名/号码组合。