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

Bash 从意外源读取while循环中的变量,bash,shell,unix,Bash,Shell,Unix,我试图将file2的内容与file1的内容进行比较,并在此基础上采取一些措施 但当我尝试从用户(在变量应答中)获取是否启动的输入时,程序不会等待用户输入,而是自动获取分配给变量行的值 #!/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)"

我试图将
file2
的内容与
file1
的内容进行比较,并在此基础上采取一些措施

但当我尝试从用户(在变量
应答
中)获取是否启动的输入时,程序不会等待用户输入,而是自动获取分配给变量
的值

#!/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
#/bin/bash
读行时;
做
var=`grep$line file1.txt`
如果[-z“$var”]
然后
echo“$line未运行”
echo“您想开始吗?(是/否)”
阅读答案
如果[“$answer”='Y']| |[“$answer”='N']
然后
如果[“$answer”=“Y”]
然后
(一些行动)
其他的
(行动)
fi
其他的
(行动)
fi
fi
完成<文件2

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

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

while read -r -u3 line; do
  echo "$line"
  read -p "Continue? " yesno
  if [[ $yesno != [Yy]* ]]; then break; fi
done 3<file2
读取-r-u3行时;做
回音“$line”
阅读-p“继续?”是否
如果[[$yesno!=[Yy]*]];然后打破;fi

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

while read -r line <&3; do
  echo "$line"
  printf "Continue? " >&2
  read yesno
  case $yesno in
    [Yy]*) : ;;
    *) break ;;
  esac
done 3<file2
读取时-r行和2
阅读yesno
案件$YESNOIN
[Yy]*):;;
*)打破;;
以撒

完成3您的代码有一些输入错误:
whileread
,并且缺少结束回勾。此外,您在第二个条件中编写了
answer
,而不是
$answer