嵌套读取失败

嵌套读取失败

我在文件中有一个文件名列表,想让用户决定如何处理每个文件名。在 bash 中,迭代文件名本身并不简单,所以我遵循这个答案:

#!/bin/bash

while IFS= read -r THELINE; 
do
  read -n 1 -p "Print line? [y/n] " answer;
  if [ ${answer} = "y" ];
  then
    echo "${THELINE}";
  fi;
done < tester;

当我尝试执行此操作(在非空文件上)时,出现以下错误if

line 5: [: =: unary operator expected

我最好的猜测是answer设置不正确,这可能是由于以read“嵌套”方式使用两次调用引起的,因为以下内容按预期工作:

#!/bin/bash

for THELINE in $(cat "tester");
do
  read -n 1 -p "Print line? [y/n] " answer;
  if [ ${answer} = "y" ];
  then
    echo "${THELINE}";
  fi;
done;

这里发生了什么?

我继续bash 4.2.24(1)-release (x86_64-pc-linux-gnu)3.2.0-37-generic #58-Ubuntu x86_64 GNU/Linux

答案1

首先,错误[is 因为answer是空的,所以[看到三个参数:=y]。始终在变量替换两边加上双引号:if [ "$answer" = "y" ]

原因是空 fd 0 由于while 循环上的$answer重定向而忙于文件输入。<tester

while IFS= read -r line <&3
do
    read -n 1 -p "Print line? [y/n] " answer
    if test "$answer" = "y"
    then
        echo "$line"
    fi
done 3< tester

答案2

尝试if [ x${answer} = "xy" ];test之前确实需要一些东西=

相关内容