Tudo que você precisa é printf.
É o print function
- esse é o seu trabalho.
printf '%s\t%s\n' ${array[@]}
Você faz assim:
( set -- 12345 56789 98765; for i ; do
eval set -- $(printf '"$%s" ' 'seq 2 $#' 1)
echo "$*"
done )
OUTPUT
56789 98765 12345
98765 12345 56789
12345 56789 98765
Eu não precisei de eval
- isso foi burro. Aqui está um melhor:
( set -- 12345 56789 98765 ;
until [ $((i=i+1)) -gt $# ] ; do
set -- $(s=$1 ; shift ; printf '%s\n' "$@" "$s")
printf '%s ' "$@" ; echo
done)
OUTPUT
56789 98765 12345
98765 12345 56789
12345 56789 98765
E se você quiser apenas dois elementos, basta mudá-lo um pouco mais uma linha:
( set -- 12345 56789 98765 ;
until [ $((i=i+1)) -ge $# ] ; do
set -- $(s=$1 ; shift ; printf '%s\n' "$@" "$s")
v="${v}$(printf '%s ' "$@")"
done ; printf "%s\t%s\n" $v
)
OUTPUT
56789 98765
12345 98765
12345 56789
Eu faço isso o tempo todo, mas nunca os bashisms. Eu sempre trabalho com o array de shell real, então demorou alguns minutos para conseguir isso.
Aqui está um pequeno roteiro que escrevi para outra resposta:
abc="a b c d e f g h i j k l m n o p q r s t u v w x y z"
for l in $abc ; do {
h= c= ; [ $((i=i+1)) -gt 26 ] && n=$((n+26)) i=
xyz=$(x=${xyz:-$abc} ;\
printf %s\n ${x#?} $l)
mid=$(set -- $xyz ; eval echo \$$((${#}/4))) ;\
echo "$mid $l" >&2 ;
[ $(((i+n)%${mod=3})) -eq 0 ] && c="$mid" h="${xyz%"$mid"*}"
line="$(printf '%s ' $h $c ${xyz#"$h"})"
printf "%s$(printf %s ${xyz#?}${mid})\n" \
${line} >|/tmp/file$((i+n))
} ; done
Isso grava em 26 arquivos. Eles se parecem com isso apenas eles incrementam por arquivo:
bcdefghijklmnopqrstuvwxyzag
ccdefghijklmnopqrstuvwxyzag
dcdefghijklmnopqrstuvwxyzag
ecdefghijklmnopqrstuvwxyzag
fcdefghijklmnopqrstuvwxyzag
gcdefghijklmnopqrstuvwxyzag
hcdefghijklmnopqrstuvwxyzag
icdefghijklmnopqrstuvwxyzag
jcdefghijklmnopqrstuvwxyzag
kcdefghijklmnopqrstuvwxyzag
lcdefghijklmnopqrstuvwxyzag
mcdefghijklmnopqrstuvwxyzag
ncdefghijklmnopqrstuvwxyzag
ocdefghijklmnopqrstuvwxyzag
pcdefghijklmnopqrstuvwxyzag
qcdefghijklmnopqrstuvwxyzag
rcdefghijklmnopqrstuvwxyzag
scdefghijklmnopqrstuvwxyzag
tcdefghijklmnopqrstuvwxyzag
ucdefghijklmnopqrstuvwxyzag
vcdefghijklmnopqrstuvwxyzag
wcdefghijklmnopqrstuvwxyzag
xcdefghijklmnopqrstuvwxyzag
ycdefghijklmnopqrstuvwxyzag
zcdefghijklmnopqrstuvwxyzag
acdefghijklmnopqrstuvwxyzag