从意外来源读取while循环中的变量

时间:2015-03-03 21:40:45

标签: bash shell unix

我正在尝试将file2的内容与file1的内容进行比较,并根据我需要采取的措施。

但是当我尝试从用户(在变量answer中)获取是否启动时,程序不会等待用户输入并自动将值赋值给变量line

#!/bin/bash

while read line;
do 
var=`grep $line file1.txt`

if [ -z "$var"] 
then 
    echo "$line is not running"
    echo "Do you want to start? (Y/N)"
    read answer
    if [ "$answer" = 'Y' ] || [ "$answer" = 'N' ]
    then
        if [ "$answer" = 'Y' ]
        then
        (some action)
        else
        (action)
        fi
    else
    (action)
    fi
fi

done < file2

2 个答案:

答案 0 :(得分:2)

您将while循环的stdin重定向到file2。因此,在循环内部,stdin被重定向,read将从文件中读取,而不是从终端读取。

使用bash,您可以使用不同的文件描述符轻松解决此问题:

while read -r -u3 line; do
  echo "$line"
  read -p "Continue? " yesno
  if [[ $yesno != [Yy]* ]]; then break; fi
done 3<file2

-u3的{​​{1}}命令行标记使其从fd 3读取,而read重定向将fd 3重定向到3<file2(打开file阅读)。

答案 1 :(得分:0)

@rici提供的优秀答案的另一种方法,这次不需要bash:

while read -r line <&3; do
  echo "$line"
  printf "Continue? " >&2
  read yesno
  case $yesno in
    [Yy]*) : ;;
    *) break ;;
  esac
done 3<file2

使用来自FD 3的read <&3次读取,就像bash扩展名read -u 3一样。