O que funcionou para mim é assim:
gv@debi64:$ ls -l *.sh
-rwxr-xr-x 1 root root 56376 Jan 20 12:40 bashtest.sh
-rwxr-xr-x 1 root root 2682 Dec 14 17:58 cpu.sh
-rwxr-xr-x 1 root root 3661 Dec 14 17:58 greptest.sh
-rwxr-xr-x 1 root root 1215 Dec 14 17:58 iconlist.sh
-rwxr-xr-x 1 root root 22096 Jan 20 11:22 inst.sh
-rwxr-xr-x 1 root root 141 Jan 18 09:21 oneshot.sh
-rwxr-xr-x 1 root root 154 Dec 27 17:48 remove.sh
-rwxr-xr-x 1 root root 2393 Dec 14 17:58 twoscreens.sh
$ ex[0]='--exclude=cpu.sh'
$ ex[1]='--exclude=inst.sh'
$ tar "${ex[@]}" -cvf backup.tar *.sh
bashtest.sh
greptest.sh
iconlist.sh
oneshot.sh
remove.sh
twoscreens.sh
Como você pode ver, os arquivos cpu.sh e inst.sh são omitidos pelo arquivo.
Da mesma forma, você poderia construir sua matriz assim:
exclude[0]='--exclude=/home/user/test1'
exclude[1]='--exclude=/home/user/test2'
exclude[2]='--exclude=/home/user/test3'
Como alternativa, o método abaixo também funcionou para mim sem a necessidade de armazenar elementos de matriz "--excluir" na frente.
$ ex[0]='cpu.sh'
$ ex[1]='inst.sh'
$ IFS=,
$ excluded=$(eval echo "--exclude="{"${ex[*]}"})
$ unset IFS
$ tar "$excluded" -cvf backup.tar *.sh
O truque aqui é a segunda linha que irá adicionar na frente de cada elemento da matriz a palavra --excluded=
usando a expansão de chave sem precisar de um loop nos elementos da matriz.
Para que a expansão da chave funcione, os elementos da matriz devem ser separados por vírgula e isso é garantido alterando o IFS para vírgula.
$ echo "$excluded"
--exclude=cpu.sh --exclude=inst.sh