Autre solution :
for item in  $(cat "$infile"); do
  length[${#item}]=$item          # use word length as index
done
maxword=${length[@]: -1}          # select last array element
printf  "longest word '%s', length %d" ${maxword} ${#maxword}
 
 Normalement, vous voudriez utiliser un while read boucle au lieu de for i in $(cat) , mais puisque vous voulez que tous les mots soient divisés, dans ce cas, cela fonctionnerait bien.
#!/bin/bash
longest=0
for word in $(<so.txt)
do
    len=${#word}
    if (( len > longest ))
    then
        longest=$len
        longword=$word
    fi
done
printf 'The longest word is %s and its length is %d.\n' "$longword" "$longest"
 bash une doublure.
sed 's/ /\n/g' YOUR_FILENAME | sort | uniq | awk '{print length, $0}' | sort -nr | head -n 1
 - lire le fichier et diviser les mots (via sed)
 - supprimer les doublons (via sort | uniq)
 - prefixez chaque mot avec sa longueur (awk)
 - trier la liste par longueur de mot
 - imprimer le seul mot avec la plus grande longueur.
 
oui, ce sera plus lent que certaines des solutions ci-dessus, mais cela ne nécessite pas non plus de se souvenir de la sémantique de bash for loops.
longest=""
for word in $(cat so.txt); do
    if [ ${#word} -gt ${#longest} ]; then
        longest=$word
    fi
done
echo $longest