我可以在不使用循环的情况下从此命令中删除 bash 子进程吗?

我可以在不使用循环的情况下从此命令中删除 bash 子进程吗?

这是一个纯粹的美学问题,因为我现在有一个工作命令,但我想在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[@]}

相关内容