외부 유틸리티를 호출 할 수 있지만 (다른 답변 참조) 스크립트 속도가 느려져 배관을 제대로 맞추기가 어렵습니다.
Zsh
zsh에서는 ${#$(readlink -f /etc/fstab)}
명령 대체 길이를 얻기 위해 쓸 수 있습니다 . 이것은 명령 출력의 길이가 아니며 마지막 줄 바꿈이없는 출력의 길이입니다.
출력의 정확한 길이를 원하면 끝에 줄 바꿈 문자가 아닌 추가 문자를 출력하고 빼십시오.
$((${#$(readlink -f /etc/fstab; echo .)} - 1))
명령 출력의 페이로드가 원하는 경우 출력이 표준 경로에 개행 문자를 더하기 때문에 여기에서 두 개 를 빼야 readlink -f
합니다.
$((${#$(readlink -f /etc/fstab; echo .)} - 2))
이것은 ${#$(readlink -f /etc/fstab)}
정식 경로 자체가 개행으로 끝나는 드물지만 가능한 경우 와 다릅니다 .
이 특정 예제의 경우, zsh에는 readlink -f
history 수정자를 통해 와 동일한 내장 구성이 있으므로 외부 유틸리티가 전혀 필요하지 않습니다 A
.
echo /etc/fstab(:A)
길이를 얻으려면 매개 변수 확장에서 히스토리 수정자를 사용하십시오.
${#${:-/etc/fstab}:A}
당신이 변수에 파일 이름이있는 경우 filename
, 그 것이다 ${#filename:A}
.
Bourne / POSIX 스타일 쉘
순수한 Bourne / POSIX 쉘 (Bourne, ash, mksh, ksh93, bash, yash ...) 중 어느 것도 내가 아는 비슷한 확장 기능이 없습니다. 명령 대체 출력에 매개 변수 대체를 적용하거나 매개 변수 대체를 중첩해야하는 경우 연속 단계를 사용하십시오.
원하는 경우 처리를 함수에 넣을 수 있습니다.
command_output_length_sans_trailing_newlines () {
set -- "$("$@")"
echo "${#1}"
}
또는
command_output_length () {
set -- "$("$@"; echo .)"
echo "$((${#1} - 1))"
}
그러나 일반적으로 혜택은 없습니다. ksh93을 제외하면 여분의 포크가 함수의 출력을 사용할 수 있으므로 스크립트 속도가 느려지고 가독성이 거의 없습니다.
다시 한번, 출력은 readlink -f
표준 경로와 개행입니다. 표준 경로의 길이를 원하면에서 1 대신 2를 빼십시오 command_output_length
. command_output_length_sans_trailing_newlines
표준 경로 자체가 개행으로 끝나지 않을 때만 사용 하면 올바른 결과를 얻을 수 있습니다.
바이트 대 문자
${#…}
멀티 바이트 로케일에서 차이를 만드는 바이트 단위가 아닌 문자 단위의 길이 여야합니다. 합리적으로 최신 버전의 ksh93, bash 및 zsh LC_CTYPE
는 ${#…}
구성이 확장 될 때의 값에 따라 문자 길이를 문자로 계산합니다 . 다른 많은 공통 쉘은 실제로 멀티 바이트 로케일을 지원하지 않습니다. 대시 0.5.7, mksh 46 및 posh 0.12.3 ${#…}
에서 길이는 바이트 단위로 리턴됩니다. 신뢰할 수있는 방식으로 문자 길이를 원하면 wc
유틸리티를 사용하십시오 .
$(readlink -f /etc/fstab | wc -m)
$LC_CTYPE
유효한 로캘 을 지정하면이 오류가 발생하거나 (멀티 바이트 로캘을 지원하지 않는 고대 또는 제한된 플랫폼에서) 올바른 길이의 문자를 반환 할 것이라고 확신 할 수 있습니다. 유니 코드의 경우 "문자 길이"는 코드 포인트 수를 의미합니다. 글리프 수는 문자 결합과 같은 복잡한 문제로 인해 또 다른 이야기입니다.
바이트 단위의 길이를 원하면 LC_CTYPE=C
임시로 설정 하거나 wc -c
대신 사용하십시오 wc -m
.
바이트 또는 문자를 계산 wc
하면 명령의 마지막 줄 바꿈 이 포함됩니다. 표준 경로의 길이를 바이트 단위로 원하면
$(($(readlink -f /etc/fstab | wc -c) - 1))
문자로 나타내려면 2를 빼십시오.
readlink -f /etc/fstab
은 11 자입니다. 개행을 잊지 마십시오. 그렇지 않으면/etc/fstabluser@cern:~$
쉘에서 실행할 때 표시 됩니다.