쉘 스크립트 함수에서 awk $ 변수를 어떻게 이스케이프해야 합니까?

쉘 스크립트 함수에서 awk $ 변수를 어떻게 이스케이프해야 합니까?

쉘 스크립트 함수에서 awk를 사용하려고 하는데 awk 변수($4)를 올바르게 이스케이프하는 방법을 알려주는 참조를 찾을 수 없는 것 같습니다. 함수 내부에서는 함수에 전달된 네 번째 항목(비어 있음)에서 지속적으로 교체됩니다.


iHealthGetFile()
{
    fileID=$(cat qkViews/${dir}iHealth-Files.json|grep -B5 '${1}'|grep id|awk '{print $4}'|sed 's/,//g; s/\"//g')
    echo $fileID
    echo "Retrieving file $1 as $fileID from ID: $ID"
}

(면책조항: 예, 아마도 파이프 명령을 사용하여 다른 작업을 수행할 수 있을 것입니다... 하지만 제 주요 목표는 우선 $4 탈출을 알아내는 것입니다.)

답변1

내가 아는 한 컨텍스트 데이터가 없으며 오류는 코드에 없지만 리터럴 4자를 찾는 awk첫 번째 코드에 있습니다 . 나는 이것이 함수에 전달된 첫 번째 인수라고 생각합니다.grep${1}

귀하의 코드를 일부 수정했습니다. 불필요한 공백을 정말로 제거하려면 echo $fileID변수 주위에 추가한 큰따옴표를 제거해야 합니다.

또한 여러 전역 변수를 사용했습니다. 지역 변수( $1)와 전역 변수( $dir$ID)를 혼합하는 것은 특별히 좋은 코딩 습관은 아니지만 때로는 스크립트에 실용주의가 필요할 수 있습니다.

iHealthGetFile()
{
    fileID=$(
        grep -B5 "$1" "qkViews/${dir}iHealth-Files.json" |
        awk '/id/ {print $4}'|
        tr -d ',"'
    )
    echo "$fileID"
    echo "Retrieving file $1 as $fileID from ID: $ID"
}

답변2

귀하의 질문에서 귀하는 쉘 함수에 전달된 $4가 null이기 때문에 awk가 null을 반환한다고 주장합니다.

awk(또는 전체 파이프라인)가 null을 반환하는 이유는 쉘 함수 인수와의 혼동 때문이 아닙니다.
이는 awk(awk 파이프라인의 왼쪽 부분)에 데이터를 공급하는 모든 항목에 유효한 네 번째 필드가 없기 때문입니다.

이 테스트는 이를 증명할 것입니다:

$ function tt { echo "1:$1-2:$2-3:$3-4:$4"; echo "first second third fourth" |awk '{print $4}'; }
$ tt one two #call the function with only two parameters. 3 and 4 are null
1:one-2:two-3:-4: #Parameters passed to function
fourth #awk result

보시다시피 awk 결과는 함수 매개변수의 영향을 받지 않습니다. awk에 제공된 데이터가 유효하면 데이터의 4번째 필드가 반환됩니다.

관련 정보