虽然您已经有了很好的答案,但您也可以使用 POSIX shell 来完成您的目标,而无需使用任何管道,使用shell 本身提供的参数扩展和字符串长度(请参阅: POSIX shell 规范)。例如,您可以执行以下操作:
#!/bin/sh
sl=32;ll=0;sn=;ln=; ## short len, long len, short name, long name
while read -r line; do ## read each line
u=${line%%:*} ## get user
len=${#u} ## get length
[ "$len" -lt "$sl" ] && { sl="$len"; sn="$u"; } ## if shorter, save len, name
[ "$len" -gt "$ll" ] && { ll="$len"; ln="$u"; } ## if longer, save len, name
done </etc/passwd
printf "shortest (%2d): %s\nlongest (%2d): %s\n" $sl "$sn" $ll "$ln"
示例使用/输出
$ sh cketcpw.sh
shortest ( 2): at
longest (17): systemd-bus-proxy
使用 pipe/head/tail/awk 或 shell 本身都可以。有替代品很好。
(注意:如果您有多个长度相同的用户,这只会选择第一个,如果您想保存所有名称并使用-le
和-ge
进行比较,可以使用临时文件。)