중첩 읽기 실패

중첩 읽기 실패

파일에 파일 이름 목록이 있고 사용자가 각 파일 이름으로 무엇을 할지 결정하기를 원합니다. 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, 및 [3개의 매개변수가 표시되기 때문에 발생합니다 =. 변수 대체는 항상 큰따옴표로 묶습니다( ) .y]if [ "$answer" = "y" ]

그 이유는 while 루프의 리디렉션으로 인해 빈 fd 0이 $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그 전에 정말 필요한 게 있어요=

관련 정보