The "Too many arguments" error is because the operator [
(synonymous with the other built-in of bash test
) is a binary or unary operator, that is, evaluates one or, at most, two elements with a comparison operation. And you're having more than two.
Something that occurs to me, to avoid a kind of redundancy, is
#!/bin/bash
main() {
declare total_argumentos=$#
[[ $total_argumentos -ne 6 ]] \
&& echo "Cantidad de argumetos incorrecta." \
&& exit 1
declare c_palabras_unicas=$(uniq <<< "$( tr ' ' '\n' <<< "$@" | sort )" | wc -l)
declare mensaje="Repeticiones: $((total_argumentos - c_palabras_unicas))"
mensaje="${mensaje}\nPalabras diferentes: $c_palabras_unicas"
[[ $c_palabras_unicas -eq 1 ]] && mensaje="${mensaje}\nTodas las palabras son iguales."
[[ $c_palabras_unicas -eq $total_argumentos ]] && mensaje="${mensaje}\nTodas las palabras son diferentes."
printf "$mensaje\n" | column -t -s :
}
main $@
Whose execution would give something similar.
$ ./script.sh uno uno uno uno uno uno # Todas los argumentos tiene la cadena "uno".
Repeticiones 5
Palabras diferentes 1
Todas las palabras son iguales.
$ ./script.sh uno uno uno uno uno dos # Ahora tienen una cadena "dos".
Repeticiones 4
Palabras diferentes 2
$ ./script.sh uno dos uno dos uno dos # Se intercalan repetidos.
Repeticiones 4
Palabras diferentes 2
$ ./script.sh {1..6} # Los numeros del 1 al 6
Repeticiones 0
Palabras diferentes 6
Todas las palabras son diferentes.
In this way, sort
orders the entered arguments.