임시 변수 없이 테스트를 사용하여 두 명령의 출력 비교

임시 변수 없이 테스트를 사용하여 두 명령의 출력 비교

나는 Bash에서 몇 가지를 테스트하고 있으며 파일의 줄 수와 고유 줄 수를 비교하기로 결정했습니다. 간단하게 해당 값을 저장하는 임시 변수 2개를 만들어서 비교할 수 있다는 것은 알지만 한 줄로 할 수 있는 방법이 궁금합니다.

예를 들어, 다음 접근 방식이 작동할 것이라고 생각합니다 test `wc -l filename` -eq `uniq filename|wc -l`. 오류가 발생합니다 -bash: test: too many arguments. 내 실수는 어디에 있으며 임시 변수를 사용하지 않고 어떻게 할 수 있습니까?

답변1

wc -l file출력 [number] fileuniq 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개의 인수가 있습니다 .-eq17

내가 제안한 것을 시도해 보면 다음과 같은 3가지 주장과 적절한 비교를 얻을 수 있습니다 test.

$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17

관련 정보