쉘 스크립트 함수에서 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번째 필드가 반환됩니다.