awkシェルスクリプトを使用してさまざまなメディアから選択

awkシェルスクリプトを使用してさまざまなメディアから選択

binフォルダの簡単なバックアッププログラムを作成しました。効果がある以下のコードと結果STDOUT。 rsync を使用して、ローカルの ~/bin フォルダーから /media/username/code/bin フォルダーにコピーします。結果が1つしかない場合、コードはうまくいきmount | grep mediaますがmount/grep。結果にスペースがないため、? で区切られます。私はそれを試して、もちろん得たfor LINEfor\nfind /mediaたくさん結果。私はこれが行く道ではないと思います。 Ao_Ao

check_media () {
  FOUNDMEDIA=$(mount | awk -F' ' '/media/{print $3}')
  echo -e "foundmedia \n$FOUNDMEDIA"
  echo For Loop
  for LINE in $FOUNDMEDIA
  do
    echo $LINE
  done
  CHOSENMEDIA="${FOUNDMEDIA}/code/bin/"
  echo -e "\nchosenmedia \n$CHOSENMEDIA\n"
  exit
}
foundmedia 
/media/dee/D-5TB-ONE
/media/dee/DZ61

For Loop
/media/dee/D-5TB-ONE
/media/dee/DZ61

chosenmedia 
/media/dee/D-5TB-ONE
/media/dee/DZ61/code/bin/

/code/bin見つかったメディアに保存パスを追加する方法を確認できますが、複数の結果に対してchosenmedia機能しない結果が表示されます。バックアップを同期または復元するメディアを選択できるようにしたいです。

答え1

マウントポイントにスペースがないと仮定すると、次のスクリプトを使用できます。

#!/bin/bash

check_media() {
    local found=(_ $(mount | awk '/media/{print $3}'))
    local index chosen

    until [[ "$chosen" =~ ^[0-9]+$ ]] && [[ "${chosen:-0}" -ge 1 ]] && [[ "${chosen:-0}" -lt ${#found[@]} ]]
    do
        for ((index=1; index < "${#found[@]}"; index++))
        do
            printf '%2d) %s\n' $index "${found[$index]}" >&2
        done

        read -p "Choice (q=quit): " chosen || { echo; return 1; }
        [ "$chosen" == q ] && return 1
    done

    printf '%s\n' "${found[$chosen]}"
}

if chosen=$(check_media)
then
    printf 'Got: %s\n' "$chosen"
fi

ただし、内容全体を作成する場合は、次のように数行でbash終わることができますcheck_media

select chosen in $(mount | awk '/media/{print $3}')
do
    printf 'Got: %s\n' "$chosen"
    # rsync
    break
done

関連情報