나는 단순히 파일을 읽고 파일에서 특정 줄을 찾으려고 합니다. 나는 bash를 처음 접했습니다. 단순화된 버전은 다음과 같습니다.
removeIgnoreEntry() {
start=0
while read line; do
echo "$line"
if [ "$line" = "ignore_profiles" ]; then
echo "Profile Start"
start=1
elif [ "$start" = 1 ]; then
if [ "$line" = "$1" ]; then
echo "Line found!"
fi
fi
done < "$FILE"
}
이상한 동작은 콘솔에 아무것도 표시하지 않는 네 번째 줄( echo "$line"
) 입니다. echo
그러나 앞에 문자를 추가하면 $line
정상적으로 표시됩니다(예 echo "My line: $line"
: ).
이유는 모르겠지만, 이것이 if
다음 명령문 echo
이 가 있는 행이 발견될 때 인식하지 못하는 이유라고 생각합니다 ignore_profiles
.
이에 대한 정보를 어디서도 찾을 수 없습니다. 아마도 올바른 키워드가 없기 때문일 것입니다.
시간 내 주셔서 감사합니다.
답변1
입력 파일에 echo
옵션으로 해석될 수 있는 내용이 포함되어 있습니까? 좋다 -n
?
printf "%s\n" "$line"
대신 시도해 보세요 echo "$line"
.
또한 read -r
그냥 대신 사용하십시오 read
.
그런데, 전체 while 루프는 쉘 함수에서 awk를 사용하여 다음과 같은 것으로 대체될 수 있습니다.
removeIgnoreEntry() {
awk -v search="$1" '{print}
/^ignore_profiles$/ { start=1; print "Profile Start" };
start == 1 && $0 == search { print "Line Found!" }' "$FILE"
}
이를 사용해야 하는 경우 awk 스크립트에서 start를 반환하면 END { exit start }
awk의 시작 변수 값에 따라 종료 코드 0 또는 1이 반환됩니다.
removeIgnoreEntry() {
awk -v search="$1" '{print}
/^ignore_profiles$/ { start=1; print "Profile Start" };
start == 1 && $0 == search { print "Line Found!" }
END {exit start}' "$FILE"
start=$? # get the exit code of the awk script into sh's $start variable.
}
이것이 정확히 당신이 원하는 것인지 완전히 확신할 수 없습니다. 주로 중첩된 if와 elif로 당신이 원하는 것이 무엇인지 알 수 없기 때문입니다.