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