Pada sistem GNU, kebalikan dari cat adalah tac:
$ tac -s" " <<< "$VAR " # Please note the added final space.
100 90 80 70 60 50 40 30 20 10
Untuk daftar singkat, dan dalam variabel, shell itu sendiri adalah solusi tercepat:
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
Keluaran:
100 90 80 70 60 50 40 30 20 10
Catatan:operasi split di set -- $var
aman untuk string persis yang digunakan di sini, tetapi tidak akan aman jika string berisi karakter wildcard (*
, ?
atau []
). Ini dapat dihindari dengan set -f
sebelum pemisahan, jika diperlukan. Catatan yang sama juga berlaku untuk solusi berikut (kecuali jika disebutkan).
Atau, jika Anda ingin menyetel beberapa variabel lain dengan daftar terbalik:
var="10 20 30 40 50 60 70 80 90 100"
set -- $var
for i; do out="$i${out:+ }$out"; done
echo "$out"
Atau hanya menggunakan parameter posisi.
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"
Atau hanya menggunakan satu variabel (yang mungkin merupakan var itu sendiri):
Catatan:Solusi ini tidak terpengaruh oleh globing atau IFS.
var="10 20 30 40 50 60 70 80 90 100"
a=" $var"
while [[ $a ]]; do
printf '<%s>' "${a##* }"
var="${a% *}"
done
awk
untuk menyelamatkan
$ 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
dengan perl
, kesopanan Bagaimana cara membaca alamat IP mundur? dibagikan oleh @steeldriver
$ echo "$var" | perl -lane '$,=" "; print reverse @F'
100 90 80 70 60 50 40 30 20 10
Atau, dengan bash
sendiri dengan mengubah string menjadi array
$ 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