행 변수를 읽는 중 큰따옴표로 묶으면 공백이 반환됩니다.

행 변수를 읽는 중 큰따옴표로 묶으면 공백이 반환됩니다.

나는 단순히 파일을 읽고 파일에서 특정 줄을 찾으려고 합니다. 나는 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로 당신이 원하는 것이 무엇인지 알 수 없기 때문입니다.

관련 정보