루프를 사용하지 않고 이 명령에서 bash 하위 프로세스를 제거할 수 있나요?

루프를 사용하지 않고 이 명령에서 bash 하위 프로세스를 제거할 수 있나요?

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[@]}

관련 정보