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