-1

As you know, there is a certain familiarity between Linux and Apple systems. I have created some bash scripts to make backups from Linux to removable devices which, with some adjustments, also work on Mac. However, one gives me two problems on Mac; on the contrary, with the same syntax works fine on Linux. Its task is to transfer files from a USB stick to the hard drive of a MacBookPro (2020, with BigSur). The script is as follows:

#!/bin/bash
USER=`whoami`
declare -A BACKUP_INFOS
BACKUP_INFOS=(
    [/Users/myuser]="/Volumes/CORSAIR/articoli /Volumes/CORSAIR/bibliografie"
    [/Users/myuser/Documents]="/Volumes/CORSAIR/dialettica /Volumes/CORSAIR/dizionario"
)
for dest_dir in "${!BACKUP_INFOS[@]}"
do
  mkdir -p "$dest_dir"
  src="${BACKUP_INFOS[$dest_dir]}"
  rsync -avuz --delete --delete-after --progress $src "$dest_dir"
done

But when I launch it from the console I get:

myuser@MacBook-Pro-di-Mauro system_files % bash macbook.sh
macbook.sh: line 7: declare: -A: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]
macbook.sh: line 37: /Users/myuser: syntax error: operand expected (error token is "/Users/myuser)

I wonder:

  1. why is the -A option problematic on Mac (while it works fine in Linux)?
  2. Why doesn't TARGET work?

POSTSCRIPTUM

Now the code appears as follows:

#!/bin/bash

backup() {
  local dest_dir="$1"
  shift
  local srcs=("$@")
  mkdir -p "$dest_dir"
  rsync -avuz --delete --delete-after --progress "${srcs[@]}" "$dest_dir"
}

backup /Users/myuser /Volumes/CORSAIR/articoli /Volumes/CORSAIR/bibliografie
/Volumes/CORSAIR/cataloghi /Volumes/CORSAIR/cd /Volumes/CORSAIR/condominio
/Volumes/CORSAIR/copertine /Volumes/CORSAIR/cratilo /Volumes/CORSAIR/Documenti
/Volumes/CORSAIR/esperienza /Volumes/CORSAIR/ezine /Volumes/CORSAIR/fichte
/Volumes/CORSAIR/filosofi /Volumes/CORSAIR/fonts /Volumes/CORSAIR/francy
/Volumes/CORSAIR/guide_debian /Volumes/CORSAIR/guide_latex 
/Volumes/CORSAIR/guide_linux /Volumes/CORSAIR/guide_php
/Volumes/CORSAIR/guide_slackware /Volumes/CORSAIR/html4dummies
/Volumes/CORSAIR/Immagini /Volumes/CORSAIR/mail /Volumes/CORSAIR/mamma
/Volumes/CORSAIR/manuale /Volumes/CORSAIR/materiali /Volumes/CORSAIR/mutt4dummies
/Volumes/CORSAIR/noneuclidee  /Volumes/CORSAIR/pearson /Volumes/CORSAIR/privacy
/Volumes/CORSAIR/protagonisti /Volumes/CORSAIR/protagonisti_nuovo
/Volumes/CORSAIR/public_html /Volumes/CORSAIR/retorica /Volumes/CORSAIR/sabina
/Volumes/CORSAIR/sacchettino /Volumes/CORSAIR/Scaricati /Volumes/CORSAIR/slack4dummies
/Volumes/CORSAIR/slackbook /Volumes/CORSAIR/slackproject /Volumes/CORSAIR/software_linux
/Volumes/CORSAIR/software_mac /Volumes/CORSAIR/storia /Volumes/CORSAIR/system_files
/Volumes/CORSAIR/tesi1 /Volumes/CORSAIR/tesi2 /Volumes/CORSAIR/tesi3
/Volumes/CORSAIR/tin4dummies /Volumes/CORSAIR/tipografia /Volumes/CORSAIR/tractatus
/Volumes/CORSAIR/varia /Volumes/CORSAIR/venetaverifiche /Volumes/CORSAIR/xindy

backup Users/myuser/Documents /Volumes/CORSAIR/argomentare /Volumes/CORSAIR/corriere
/Volumes/CORSAIR/dialettica /Volumes/CORSAIR/dizionario /Volumes/CORSAIR/ermeneutica
/Volumes/CORSAIR/fichte /Volumes/CORSAIR/neopositivisti /Volumes/CORSAIR/novecento
/Volumes/CORSAIR/schelling /Volumes/CORSAIR/scuola

However, I still receive:

myuser@MacBook-Pro-di-Mauro system_files % bash macbook.sh
building file list ... 
617 files to consider

sent 11651 bytes  received 20 bytes  23342.00 bytes/sec
total size is 22103468  speedup is 1893.88
macbook.sh: riga 12: /Volumes/CORSAIR/cataloghi: Is a directory
macbook.sh: riga 13: /Volumes/CORSAIR/copertine: Is a directory
macbook.sh: riga 14: /Volumes/CORSAIR/esperienza: Is a directory
macbook.sh: riga 15: /Volumes/CORSAIR/filosofi: Is a directory
macbook.sh: riga 16: /Volumes/CORSAIR/guide_debian: Is a directory
macbook.sh: riga 17: /Volumes/CORSAIR/guide_linux: Is a directory
macbook.sh: riga 18: /Volumes/CORSAIR/guide_slackware: Is a directory
macbook.sh: riga 19: /Volumes/CORSAIR/Immagini: Is a directory
macbook.sh: riga 20: /Volumes/CORSAIR/manuale: Is a directory
macbook.sh: riga 21: /Volumes/CORSAIR/noneuclidee: Is a directory
macbook.sh: riga 22: /Volumes/CORSAIR/protagonisti: Is a directory
macbook.sh: riga 23: /Volumes/CORSAIR/public_html: Is a directory
macbook.sh: riga 24: /Volumes/CORSAIR/sacchettino: Is a directory
macbook.sh: riga 25: /Volumes/CORSAIR/slackbook: Is a directory
macbook.sh: riga 26: /Volumes/CORSAIR/software_mac: Is a directory
macbook.sh: riga 27: /Volumes/CORSAIR/tesi1: Is a directory
macbook.sh: riga 28: /Volumes/CORSAIR/tin4dummies: Is a directory
macbook.sh: riga 29: /Volumes/CORSAIR/varia: Is a directory
building file list ... 
87 files to consider

sent 1770 bytes  received 20 bytes  3580.00 bytes/sec
total size is 7654550  speedup is 4276.28
macbook.sh: riga 32: /Volumes/CORSAIR/dialettica: Is a directory
macbook.sh: riga 33: /Volumes/CORSAIR/fichte: Is a directory
macbook.sh: riga 34: /Volumes/CORSAIR/schelling: Is a directory
user41063
  • 109
  • 4

1 Answers1

3

Check the bash version. Associative arrays with -A were added in bash version 4.

To get it to work with version 3 you could replace the array with a backup helper function that gets called for each set of paths:

#!/bin/bash

backup() {
    local dest_dir="$1"
    shift
    local srcs=("$@")
    mkdir -p "$dest_dir"
    rsync -avuz --delete --delete-after --progress "${srcs[@]}" "$dest_dir"
}

backup /Users/myuser \
    /Volumes/CORSAIR/articoli \
    /Volumes/CORSAIR/bibliografie \
    ;
backup /Users/myuser/Documents \
    /Volumes/CORSAIR/dialettica \
    /Volumes/CORSAIR/dizionario \
    ;
John Kugelman
  • 349,597
  • 67
  • 533
  • 578
  • In any case, I'm trying to install version 4 following https://apple.stackexchange.com/questions/193411/update-bash-to-version-4-0-on-osx – user41063 Oct 17 '21 at 00:03
  • To split the commands up into multiple lines you'll need to use backslashes. See my updated answer. – John Kugelman Oct 17 '21 at 01:49
  • Now it works fine, thank you very much. In any case, I update bash too, and the original version now works it too :) – user41063 Oct 17 '21 at 02:01