En los sistemas GNU, el reverso de cat es tac:
$ tac -s" " <<< "$VAR " # Please note the added final space.
100 90 80 70 60 50 40 30 20 10
Para una lista corta, y en una variable, el propio shell es la solución más rápida:
var="10 20 30 40 50 60 70 80 90 100"
set -- $var; unset a
for ((i=$#;i>0;i--)); do
printf '%s%s' "${a:+ }" "${!i}"
a=1
done
echo
Salida:
100 90 80 70 60 50 40 30 20 10
Nota:la operación de división en set -- $var
es seguro para la cadena exacta utilizada aquí, pero no lo será si la cadena contiene caracteres comodín (*
, ?
o []
). Se puede evitar con set -f
antes de la división, si es necesario. La misma nota también es válida para las siguientes soluciones (excepto donde se indique).
O, si desea establecer alguna otra variable con la lista inversa:
var="10 20 30 40 50 60 70 80 90 100"
set -- $var
for i; do out="$i${out:+ }$out"; done
echo "$out"
O usando solo los parámetros posicionales.
var="10 20 30 40 50 60 70 80 90 100"
set -- $var
a=''
for i
do set -- "$i${a:+ [email protected]}"
a=1
done
echo "$1"
O usando solo una variable (que puede ser var):
Nota:Esta solución no se ve afectada por globing ni IFS.
var="10 20 30 40 50 60 70 80 90 100"
a=" $var"
while [[ $a ]]; do
printf '<%s>' "${a##* }"
var="${a% *}"
done
awk
al rescate
$ var='10 20 30 40 50 60 70 80 90 100'
$ echo "$var" | awk '{for(i=NF; i>0; i--) printf i==1 ? $i"\n" : $i" "}'
100 90 80 70 60 50 40 30 20 10
con perl
, cortesía ¿Cómo leer una dirección IP al revés? compartido por @steeldriver
$ echo "$var" | perl -lane '$,=" "; print reverse @F'
100 90 80 70 60 50 40 30 20 10
O, con bash
sí mismo convirtiendo la cadena en matriz
$ arr=($var)
$ for ((i=${#arr[@]}-1; i>=0; i--)); do printf "${arr[i]} "; done; echo
100 90 80 70 60 50 40 30 20 10