2

/Volumes の内容に基づいて、バックアップ可能なドライブのリストをユーザーに提供するための mac os x 用の簡単なスクリプトを作成していますが、「find」コマンドの出力を処理する際に問題が発生しています。ドライブ名にスペースが含まれています。find コマンドは各ドライブを別々の行に出力しますが、「for each」は名前を部分に分割します。例:

脚本:

#!/bin/bash
find /Volumes -maxdepth 1 -type d
echo ""

i=1
for Output in $(find /Volumes -maxdepth 1 -type d)
do
DriveChoice[$i]=$Output
echo $i"="${DriveChoice[$i]}
i=$(( i+1 ))
done

出力:

/Volumes
/Volumes/backup
/Volumes/EZBACKUP DRIVE
/Volumes/Tech

1=/Volumes
2=/Volumes/backup
3=/Volumes/EZBACKUP
4=DRIVE
5=/Volumes/Tech
logout

[Process completed]

これはかなり簡単なようです。これを達成するためのより良い方法はありますか?

更新:完璧に機能するchepnerに感謝します。上記のコマンドを生成するのは単純なスクリプトですが、誰かが役に立つと思った場合に備えて、とにかくここに投稿します。

#!/bin/bash
#Get admin rights
sudo -l -U administrator bash
#Set the path to the backup drive
BackupPath="/Volumes/backup/"
#Generate a list of source drives, limiting out invalid options
i=1
while read -r Output; do
if [ "$Output" != "/Volumes" ] && [ "$Output" != "/Volumes/backup" ] && [ "$Output" != "/Volumes/Tech" ] ; then
    DriveChoice[$i]=$Output
    echo "$i=${DriveChoice[$i]}"
    i=$(( i+1 ))
fi
done < <( find /Volumes -maxdepth 1 -type d)

#Have the user select from valid drives
echo "Source Drive Number?"
read DriveNumber
#Ensure the user input is in range
if [ $DriveNumber -lt $i ] && [ $DriveNumber -gt 0 ]; then
    Source=${DriveChoice[$DriveNumber]}"/"
    #Get the user's NetID for generating the folder structure
    echo "User's NetID?"
    read NetID
    NetID=$NetID
    #Grab today's date for generating folder structure
    Today=$(date +"%m_%d_%Y")
    #Destination for the Logfile
    Destination=$BackupPath$NetID"_"$Today"/"
    #Full path for the LogFile
    LogFile=$Destination$NetID"_log.txt"
    mkdir -p $Destination
    touch $LogFile
    #Destination for the backup
    Destination=$Destination"ditto/"
    #Execute the command
    echo "Processing..."
    sudo ditto "$Source" "$Destination" 2>&1 | tee "$LogFile"
else
    #Fail if the drive selection was out of range
    echo "Drive selection error!"
fi
4

1 に答える 1

2

表示されているスペースの問題のためfind、ループを使用した出力を安全に反復することはできません。代わりに組み込みのループをfor使用します。whileread

#!/bin/bash
find /Volumes -maxdepth 1 -type d
echo ""

i=1
while read -r output; do
    DriveChoice[$i]=$output
    echo "$i=${DriveChoice[$i]}"
    i=$(( i+1 ))
done < <( find /Volumes -maxdepth 1 -type d)
于 2013-03-07T14:56:57.000 に答える