csh 스크립트를 bash로 번역하고 있는데 다음과 같은 줄을 발견했습니다.
@ lines = `grep num_lines ../config.txt | awk '{printf("%d",int($2))}' `
여기서 "@"은 무엇을 합니까? 내가 좀 찾았어문서"@"를 표현식으로 사용하여 csh를 선언합니다. 그러나 이것은 나에게 일반적인 변수 할당처럼 보입니다. bash에서 코드의 grep 및 awk 부분을 실행하면 출력은 "%d 12045"와 같이 "%d" 앞에 오는 정수입니다.
답변1
글쎄요, 이 스크립트를 쓴 사람이 무슨 생각을 했는지 아는 것은 불가능합니다. 그러나 다음은 몇 가지 관찰 사항입니다.
awk
명령이 표시 되면printf
입력 줄에 두 번째 문자열의 정수 값이 인쇄됩니다.- ~처럼엠마 루오 댓글제가 리뷰한 대로,
awk
그것은 매우 강력한 프로그램입니다.grep
, 또는 다른 와sed
함께 실행할 필요가 거의 없습니다awk
. 그래서grep num_lines파일 이름| awk '{ printf("%d", int($2)) }'
다음과 같이 쓸 수 있다awk '/num_lines/ { printf("%d", int($2)) }'파일 이름
- 위에서도 말씀드렸듯
int($2)
이정수 부분 입력 줄의 두 번째 문자열 값입니다. 따라서 프로필에 이라고 표시되어 있으면 을num_lines foo
얻 습니다0
. 형식이 잘 지정된 구성 파일을 사용하면 그러한 예방 조치를 취할 필요가 없는 것 같습니다.num_lines 3.14
3
- 어떤 경우 에라도,
printf("%d", int($2))
받아들일 수 없다. 내가 아는 한,printf("%d", $2)
그리고정수 인쇄($2)
(거의) 동일합니다. - 제가 확인할 수 있는 한 가지 차이점은 이
printf
버전은 끝에 개행 문자를 쓰지 않는다는 것입니다.$ echo "num_lines 42" awk '{printf("%d", $2)}';날짜 422019년 5월 13일 월요일 오전 12:00:00 $ echo "num_lines 42" awk '{print int($2)}';날짜 42 2019년 5월 13일 월요일 오전 12:00:01
`…`
그러나 후행 개행 문자가 제거되므로 이는 실제로 관련이 없습니다 . - "이것은 나에게 일반적인 변수 할당처럼 보입니다"라고 말합니다. 그러나 [t]csh 사용자는 이것이 허용되지 않는다는 것을 알고 있습니다.
바꾸다=값
당신은 말해야놓다 바꾸다=값
또는@ 바꾸다=표현
물론 간단한 정수 상수도 유효합니다.expr
, 따라서 저자는 아마도 더 짧고 값이 정수라는 것을 알고 있기 때문에@
대신 사용했을 것입니다.set
따라서 이 명령문은 변수를 lines
from의 값으로 설정합니다.num_lines
../config.txt