我想编写一个脚本,它可以帮助我安装思考。(我为 bash 练习编写了它)我想要一个带有“在选项中选择选项”的菜单
#!/bin/bash
download="~/Downloads/"
options='ls -l -d $download'
select option in $options; do
if [ "Test" = $option ]; then
clear
exit
else
echo hello
fi
done
该脚本应提供下载中的每个文件以供选择。如果是 tar.gz 文件,则应将其安装在 opt 中。但我不知道如何获取选择菜单
答案1
这是一个最小的工作示例。请注意以下几点:
波浪符号 (
~
) 不会在双引号内扩展,因此需要放在外面。考虑download=~/"Downloads"
用download="$HOME/Downloads"
不要使用
ls
它来生成文件名列表 - 如果任何文件名有空格,它就会中断。使用 shell glob*
,并将结果放入数组中
所以:
#!/bin/bash
download=~/"Downloads"
options=( "$download"/* )
select option in "${options[@]}" "quit"; do
case $option in
*.tar.gz)
echo "install some stuff"
;;
"quit")
break ;;
*)
echo "You chose $option" ;;
esac
done
答案2
你说你正在学习 bash,所以我认为你可能会喜欢一种不同类型的答案,zenity
它是 Ubuntu 内置的流行的 bash GUI。
Zenity 对话框
zenity 文件选择对话框如下所示:
调用脚本
以下是如何调用脚本以及当您选择列表中的项目时它向终端输出的内容:
$ Downloads.sh
Option: /home/rick/Downloads/nvhda.tar.xz
您的脚本版本不会显示“选项:”,而是运行一个tar
命令。
Downloads.sh bash 脚本
#!/bin/bash
# NAME: Downloads.sh
# PATH: ~/askubuntu
# DESC: Select Download file
# DATE: July 15, 2019.
# NOTE: For: https://askubuntu.com/questions/1158485/how-to-get-ls-in-select-in
Array=( ~/"Downloads"/* )
while true; do
Option=$(zenity --list --title="Downloads.sh" --text="Select file" \
--ok-label "TAR process" --cancel-label "Exit" \
--width=800 --height=600 --column="Filename" "${Array[@]}" 2>/dev/null)
[[ "$Option" == "" ]] && break
echo "Option: $Option"
done
答案3
select 命令将尝试显示由空格、制表符和换行符分隔的每个字段。因此,我认为您的示例不会满足您的要求。您不能使用“ls -l”进行长列表,否则权限、所有权和文件大小都将成为 select 语句结果中显示的字段。
不确定这是否正是您要找的内容,但它会找到所有文件(没有目录或符号链接)并决定是否将其作为 PostgreSQL 备份或普通文件处理。您可以随时调整它以查找您希望在下载目录中找到的任何内容。
您可以考虑将 if 语句改为 case,然后尝试查找特定扩展名。这样您就可以找到 .tar 或 .gz 或 .cpio,等等。只需弄清楚如何删除扩展名即可。
#!/bin/bash
download="/tempfs"
cd $download
options=$(ls -l |grep -v "^d" |awk '{print $9}')
select option in $options
do
if test "$(echo $option|grep ".dmp$")" = ""
then
echo "Process as normal file: ${option}"
exit 0
else
echo "Process as pg_dump file: ${option}"
exit 0
fi
done