![使用 awk shell 脚本从各种媒体中进行选择](https://linux22.com/image/212199/%E4%BD%BF%E7%94%A8%20awk%20shell%20%E8%84%9A%E6%9C%AC%E4%BB%8E%E5%90%84%E7%A7%8D%E5%AA%92%E4%BD%93%E4%B8%AD%E8%BF%9B%E8%A1%8C%E9%80%89%E6%8B%A9.png)
我为我的 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