Создайте массив в сценарии bash из установленных внешних USB-накопителей на macOS

Я пишу сценарий bash и изо всех сил пытаюсь найти способ создания ассоциативного массива, который содержит ключ и один атрибут для каждого подключенного внешнего жесткого диска, подключенного через USB. Мой пример, используемый здесь, представляет собой ассоциативный массив, но это не обязательно. Хотя я чувствую, что это имеет наибольший смысл. И да, я использую bash 4 для поддержки ассоциативного массива.

> /bin/bash --version GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0) 

В настоящее время я играю с diskutil list и system_profiler SPUSBDataType как подоболочки в цикле for . Или просто синтаксический анализ пучка вывода через трубы с помощью команды sed , grep и awk . Пока нет пользы. Следует отметить, что эти команды apple выводят другие вещи, которые я хочу отбросить, например, устройства Bluetooth и мой локальный жесткий диск. Подробнее см. Ниже.

  • Как передать текст для тела электронной почты Mutt, а затем отредактировать электронную почту в интерактивном режиме?
  • bash - Как я могу повторно отобразить меню выбора после выбора и выполнения выбора
  • Как я могу заказать вывод команды «эхо»
  • Что делает !!: означает в bash?
  • как перебирать аргументы в сценарии bash
  • Вернуть код выхода без повреждения терминала вызывающего абонента?
  • Мой желаемый массив выглядел бы примерно так: myArray=([Name1]=/dev/disk3s2 [Name2]=/dev/disk4s2) . Мне просто нужно имя и точка монтирования. Формат его гибкий. Я могу разобрать его позже, если в другом формате. Мне просто нужно иметь возможность сделать простой for i in "!${myArray[@]}; do echo "Name = ${i}"; echo "mount point = ${myArray[$i]}"; done или что-то подобное.

    Примечание: в конце дня его запрос подскажет пользователю что-то вроде «У вас установлено N количество внешних жестких дисков, выберите, из которого вы хотите выполнить резервное копирование до«

    В качестве запроса здесь приведен пример вывода основных двух команд ( diskutil list и system_profiler SPUSBDataType ), которые я использовал, чтобы попытаться достичь моей цели. Хотя следует отметить, что меня не волнует, есть ли другие способы достижения той же желаемой цели. Если вы знаете другие полезные команды, пожалуйста, предложите.

     > diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *500.3 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_CoreStorage Macintosh HD 499.4 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 (internal, virtual): #: TYPE NAME SIZE IDENTIFIER 0: Apple_HFS Macintosh HD +499.1 GB disk1 Logical Volume on disk0s2 A0B29294-0031-40CB-8894-6F56545CCF3C Unencrypted /dev/disk3 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *2.0 TB disk3 1: EFI EFI 209.7 MB disk3s1 2: Apple_HFS Storage 2.0 TB disk3s2 

    а также

     > system_profiler SPUSBDataType USB: USB 3.0 Bus: Host Controller Driver: AppleUSBXHCIWPT PCI Device ID: 0x9cb1 PCI Revision ID: 0x0003 PCI Vendor ID: 0x8086 BUP Slim SL: Product ID: 0xab26 Vendor ID: 0x0bc2 (Seagate LLC) Version: 1.08 Serial Number: NA96KBJB Speed: Up to 5 Gb/sec Manufacturer: Seagate Location ID: 0x14500000 / 3 Current Available (mA): 900 Current Required (mA): 896 Extra Operating Current (mA): 396 Media: BUP Slim SL: Capacity: 2 TB (2,000,398,933,504 bytes) Removable Media: No BSD Name: disk3 Logical Unit: 0 Partition Map Type: GPT (GUID Partition Table) USB Interface: 0 Volumes: EFI: Capacity: 209.7 MB (209,715,200 bytes) File System: MS-DOS FAT32 BSD Name: disk3s1 Content: EFI Volume UUID: 0E239BC6-F960-3107-89CF-1C97F78BB46B Storage: Capacity: 2 TB (2,000,054,960,128 bytes) Available: 1.3 TB (1,298,787,659,776 bytes) Writable: Yes File System: Journaled HFS+ BSD Name: disk3s2 Mount Point: /Volumes/Storage Content: Apple_HFS Volume UUID: E9786DAE-78A7-31B7-B939-8FCCE3C147AB Bluetooth USB Host Controller: Product ID: 0x8290 Vendor ID: 0x05ac (Apple Inc.) Version: 1.46 Speed: Up to 12 Mb/sec Manufacturer: Broadcom Corp. Location ID: 0x14300000 / 2 Current Available (mA): 500 Current Required (mA): 0 Extra Operating Current (mA): 0 Built-In: Yes 

    diskutil list | tail -n +15 diskutil list | tail -n +15 даст мне в основном все после моего локального жесткого диска.

    Еще одна мысль о том, что я могу сделать что-то вроде for usb in $(system_profiler SPUSBDataType) . Но я не могу понять правильную команду подоболочки для подключения к sed , grep , awk и другим инструментам для синтаксического анализа пустых строк или отступов. Скорее всего, я не смогу полностью реализовать его одним движением.

  • Сценарий Bash не работает как cronjob
  • Bash: удалить числа (штрих-числовые символы) из строковой переменной
  • Разница между ~ / .profile и ~ / .bash_profile
  • ключевое слово grom () в bash бросает неожиданный '(' токен
  • как установить стиль тильды + псевдоним?
  • Как найти перекрытие двух строк в bash?
  • One Solution collect form web for “Создайте массив в сценарии bash из установленных внешних USB-накопителей на macOS”

    Я не уверен, что это сработает для вас или нет, поскольку оно проверяет только внешние диски и не обязательно USB-накопители, но я считаю, что в основном это то, что вам нужно:

     #! /usr/local/bin/bash - IFS= mapfile -t DISKUTIL_LIST < <(diskutil list external) declare -A myAssocArray for line in "${DISKUTIL_LIST[@]}"; do DISK_MOUNT=$(echo $line | awk '{print $1}') if [[ "${#DISK_MOUNT}" -lt '3' ]]; then : else ARRAY_INDEX=$(mount | grep "$DISK_MOUNT" | awk '{print $3}' | awk -F'/' '{print $NF}') MOUNT_POINT=$(mount | grep "$DISK_MOUNT" | awk '{print $1}') myAssocArray+=([${ARRAY_INDEX}]="$MOUNT_POINT") fi done for disk in "${!myAssocArray[@]}"; do echo -e "Name:\t\t${disk}\nMount Point:\t${myAssocArray[$disk]}" done 

    Образец вывода для меня (у меня только один внешний в данный момент):

     {0} ➔ ./usb-drives.sh Name: JBUTRYN Mount Point: /dev/disk2s1 
    Linux и Unix - лучшая ОС в мире.