나는 Bash에서 몇 가지를 테스트하고 있으며 파일의 줄 수와 고유 줄 수를 비교하기로 결정했습니다. 간단하게 해당 값을 저장하는 임시 변수 2개를 만들어서 비교할 수 있다는 것은 알지만 한 줄로 할 수 있는 방법이 궁금합니다.
예를 들어, 다음 접근 방식이 작동할 것이라고 생각합니다 test `wc -l filename` -eq `uniq filename|wc -l`
. 오류가 발생합니다 -bash: test: too many arguments
. 내 실수는 어디에 있으며 임시 변수를 사용하지 않고 어떻게 할 수 있습니까?
답변1
wc -l file
출력 [number] file
과 uniq file | wc -l
출력만 있기 때문에 직접적인 비교는 할 수 없습니다 [number]
. @stelldriver가 제안한 대로 를 사용하여 파일을 wc
의 표준 입력 으로 리디렉션하여 출력 wc -l < file
만 [number]
출력하거나 awk를 사용하여 첫 번째 필드만 가져올 수 있습니다(아래 참조).
또한 백틱은 가독성에 좋지 않습니다. 구성 을 선호합니다 $(command)
.
표현식이 인용되지 않았기 때문에 "인수가 너무 많습니다". 따라서 쉘은 출력을 [number] file
하나가 아닌 두 단어로 분할합니다.
대체로 이것이 당신이 추구하는 것입니다:
test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
첫 번째 필드 wc -l file
인 .[number]
답변을 더 명확하게 하기 위해 echo
명령 앞에를 추가하여 원래 시도에서 어떤 일이 발생하는지 확인하세요.
$ echo test `wc -l file` -eq `uniq file|wc -l`
test 19 file -eq 17
보시다시피, 명령에는 test
, 19
및 4 file
개의 인수가 있습니다 .-eq
17
내가 제안한 것을 시도해 보면 다음과 같은 3가지 주장과 적절한 비교를 얻을 수 있습니다 test
.
$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17