这是一个纯粹的美学问题,因为我现在有一个工作命令,但我想在wc -m
没有显式循环或运行子 shell/子 shell 进程的情况下对客户端数组中的每个元素运行。 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
使用管道就是在子shell中执行命令。你可以这样避免它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[@]}