Shell-Script

使用 awk shell 腳本從各種媒體中進行選擇

  • October 17, 2022

我為我的 bin 文件夾製作了一個簡單的備份程序。有用。下面的程式碼和結果 STDOUT。使用 rsync 從本地 ~/bin 文件夾複製到 /media/username/code/bin 文件夾。當只有一個結果時,程式碼可以正常工作,mount | grep media但我無法理解如何將其推進到讓我從mount/grep. 我懷疑for LINE下面的內容很幸運,因為我相信for在 shell 腳本中由空格分隔,但是由於結果中沒有空格,所以它在\n? 我試過find /media了,當然得到了很多結果。我認為不是要走的路。O_O

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無法工作的結果。我希望能夠選擇要將備份同步到或從中恢復的媒體。

假設您的掛載點不包含空格,您可以使用如下腳本:

#!/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

引用自:https://unix.stackexchange.com/questions/721286