ループを使用せずにこのコマンドから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

1行ではなくソリューションを喜んで受け入れたい場合は、この機能はとても楽しいと思います。

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

関連情報