다음 내용이 포함된 플랫 파일 데이터베이스(ff_servers.db)가 있습니다.
192.168.154.2 Alaska hp
192.168.157.3 Colorado dell
192.168.156.3 hawaii hp
명령줄에서 다음을 실행할 수 있습니다.
awk "BEGIN{IGNORECASE=1;}/alaska/ {print $NF}" ff_servers.db`
나는 얻을 것이다
hp
그러나 Bash 스크립트에서는 "$NF" 문제가 발생합니다. 해당 스크립트의 덤프는 다음과 같습니다.
machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \$NF}" ff_servers.db`
awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print $NF}" ff_servers.db
++ awk 'BEGIN{IGNORECASE=1;}/colorado/ {print }' ff_servers.db
+ target_arch='192.168.157.3 Colorado dell'
분명히 $NF가 올바르게 번역되지 않았습니다. 내가 뭘 잘못했나요?
답변1
$
Bash는 큰따옴표로 변수를 확장합니다(예: "
.
명령줄에서 대화형으로 이 작업을 수행할 때도 문제가 됩니다. Bash는 Expand를 시도하고, "$NF"
변수가 정의되지 않은 경우 Bash는 이를 빈 문자열로 확장합니다.NF
'
일반적 으로 작은따옴표를 사용하여 $NF
bash가 확장하지 않도록 할 수 있습니다 .
하지만 확장하고 싶기 때문에 ${server_name}
이중 탈출을 시도해 볼 수 있습니다.
machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \\$NF}" ff_servers.db`
문자열 연결을 사용해 볼 수도 있습니다. 차이점은 대부분 스타일에 있습니다.
machine_type=`awk 'BEGIN{IGNORECASE=1;}/'${server_name}'/{print $NF}' ff_servers.db`
이는 bash가 인접한 문자열을 함께 연결하기 때문입니다.