파일에 파일 이름 목록이 있고 사용자가 각 파일 이름으로 무엇을 할지 결정하기를 원합니다. 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
그 전에 정말 필요한 게 있어요=