使用 awk shell 脚本从各种媒体中进行选择

使用 awk shell 脚本从各种媒体中进行选择

我为我的 bin 文件夹制作了一个简单的备份程序。有用。下面的代码和结果 STDOUT。使用 rsync 从本地 ~/bin 文件夹复制到 /media/username/code/bin 文件夹。当只有一个结果时,代码工作正常,mount | grep media但我不太明白如何将其推进到让我从mount/grep.我怀疑for LINE下面的内容很幸运能够工作,因为我相信for在 shell 脚本中是由空格分隔的,但由于结果中没有空格,所以它在\n?上分隔。我尝试过find /media,当然得到了很多结果。我认为这不是要走的路。奥_奥

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

相关内容