Создайте массив в сценарии 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 и мой локальный жесткий диск. Подробнее см. Ниже.

Мой желаемый массив выглядел бы примерно так: 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 и другим инструментам для синтаксического анализа пустых строк или отступов. Скорее всего, я не смогу полностью реализовать его одним движением.

  • Есть ли способ отменить команду «cpp» в терминале?
  • Mac OS X find / grep генерирует "unknown --devices option"
  • arecord для mac?
  • Установите rEFInd на OS X 10.10 Yosemite
  • Как скопировать пасту на удаленный сервер?
  • Для некоторых IP-адресов ping -c 4 -W 1 ip | cat ничего не выводит, пока ping не закончит, тогда как для других
  • Можете ли вы выполнять системные вызовы с терминала OSX?
  • Как я могу открыть файлы на моем внешнем жестком диске?
  • 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 
    Interesting Posts

    Почему имя хоста –fqdn возвращает только имя домена?

    После обновления до Jessie управление сервисом не возвращает результат

    Необходимо написать сценарий «thirsty.sh»: BASH

    Почему `find` не удаляет найденные файлы?

    Отключите питание USB для управляемой электропитанием USB

    получить доступный размер экрана после рассмотрения пространства, используемого в строке меню и панели запуска

    Используйте функцию автозаполнения терминала для ввода сценария оболочки

    Как написать регулярное выражение для поиска строк с фиксированной длиной с хотя бы одним вхождением символа

    Как пользователь получает доступную папку sshfs?

    Может ли VM обменяться основной памятью?

    Предполагается, что «userdel -root?»

    Как определить варианты, с которыми ядро ​​Linux строилось?

    Backticks не работают при инкапсулировании пути в кавычки

    Существует ли для Linux версия рабочей программы H.265?

    FreeBSD csh, TAB, чтобы показать доступные варианты?

    Linux и Unix - лучшая ОС в мире.