wc -m
현재 작동 중인 명령이 있기 때문에 이것은 순전히 미적인 질문이지만 명시적인 루프나 서브셸/서브셸 프로세스를 실행하지 않고 클라이언트 배열의 각 요소에서 이를 실행 하고 싶습니다 . Bash는 macOS에서 실행되는 v5.0.18입니다.
clients=(one two three)
printf '%s\n' "${clients[@]}" | xargs -I{} bash -c 'echo -n {} | wc -m' | sort -nr | head -1
답변1
좀 더 인터넷 검색을 한 후에 다음과 같은 멋진 awk 스크립트를 찾았습니다.
printf '%s\n' "${clients[@]}" | awk '{print length}' | sort -nr | head -1
답변2
한 줄이 아닌 솔루션을 기꺼이 받아들이고 싶다면 이 기능이 매우 즐겁다고 생각합니다.
length() {
echo ${#1}
}
map() {
func=$1
shift
for arg; do
$func "$arg"
done
}
max() {
read -r max
while read -r arg; do
(( arg > max )) && max=$arg
done
echo $max
}
그런 다음
map length "${clients[@]}" | max
답변3
파이프를 사용하는 것은 서브셸에서 명령을 실행하는 것입니다. 다음과 같이 피할 수 있습니다 awk
.
awk -v RS="[[:space:]]" 'length > len {len = length} END {print len}' <<<${clients[@]}
GNU에만 해당 awk
:
awk -v RS="[[:space:]]" '{D[NR]=length}; END {asort(D); print D[NR]}' <<<${clients[@]}