Bem, por que você não tem uma única string (all '|') e tente substituir o (primeiro) '|' com '-' em todas as iterações do loop?
Exemplo de substituição de string:
stringZ=abcABC123ABCabc
echo ${stringZ/abc/xyz} # xyzABC123ABCabc
# Replaces first match of 'abc' with 'xyz'.
Dessa forma, você não precisa de várias strings sem o array hdeck.
Tente isto:
deck="| | | | | "
while true
do
clear
echo -n -e "\r$deck"
sleep 0.8
for ((i=1; i<='expr length $deck'; i++))
do
echo -n -e "\r${deck/|/-}"
sleep 0.2
done
clear
done
O script acima deve fazê-lo. Este é apenas um script indicativo e eu mesmo não o executei .. Por favor, verifique os erros de sintaxe ..
Mais informações sobre a manipulação de strings no bash estão aqui - link