MacOS上的Bash脚本



如你所知,Linux和苹果系统之间有某种相似之处。我已经创建了一些bash脚本,用于从Linux备份到可移动设备,经过一些调整,也可以在Mac上运行。然而,其中一个给我在Mac上带来了两个问题;相反,使用相同的语法在Linux上工作得很好。它的任务是将文件从u盘传输到MacBookPro的硬盘驱动器(2020年,带BigSur)。脚本如下:

#!/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

但是当我从控制台启动它时,我得到:

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)

我想知道:

  1. 为什么-A选项在Mac上有问题(而它在Linux中工作良好)?
  2. 为什么TARGET不工作?

附启

现在代码如下所示:
#!/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

然而,我仍然收到:

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

检查bash版本。在bash version 4中添加了与-A关联的数组。

要使它在版本3中工作,您可以将数组替换为backuphelper函数,该函数将为每组路径调用:

#!/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 
;