awk 쉘 스크립트를 사용하여 다양한 미디어에서 선택

awk 쉘 스크립트를 사용하여 다양한 미디어에서 선택

bin 폴더에 대한 간단한 백업 프로그램을 만들었습니다. 효과가있다. 아래 코드와 결과 STDOUT. rsync를 사용하여 로컬 ~/bin 폴더에서 /media/username/code/bin 폴더로 복사합니다. 결과 가 하나만 있을 때 코드는 잘 작동 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

관련 정보