【问题标题】:Bash script on MacOS [duplicate]MacOS上的Bash脚本[重复]
【发布时间】:2021-12-04 13:54:20
【问题描述】:

如您所知,Linux 和 Apple 系统之间存在一定的熟悉度。 我创建了一些 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 不起作用?

POSTSCRIPTUM

现在代码如下:

#!/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 或在本地编译它,然后把它放在你的 PATH 中,然后开心!

标签: bash macos shell


【解决方案1】:

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

要使其与版本 3 一起使用,您可以将数组替换为 backup 辅助函数,该函数会为每组路径调用:

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

【讨论】:

  • 无论如何,我正在尝试在apple.stackexchange.com/questions/193411/…之后安装第4版
  • 要将命令拆分为多行,您需要使用反斜杠。请参阅我的更新答案。
  • 现在可以正常使用了,非常感谢。无论如何,我也更新了 bash,原来的版本现在也可以了 :)
猜你喜欢
  • 2020-11-10
  • 2020-04-02
  • 2021-08-10
  • 1970-01-01
  • 2010-10-24
  • 2013-01-24
  • 2016-10-17
  • 2014-03-13
  • 1970-01-01
相关资源
最近更新 更多