AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1106787
Accepted
MarianoM
MarianoM
Asked: 2019-01-04 18:41:23 +0800 CST2019-01-04 18:41:23 +0800 CST 2019-01-04 18:41:23 +0800 CST

创建允许您选择多个选项而不仅仅是一个选项的 bash 脚本?

  • 772

我正在考虑创建一个 bash 脚本,其中可以指定多个选项,最后根据所选选项定义变量或在收到不同选项时执行某些命令。一个例子值一千多字:

[X] 仅复制 (1) - 用户键入的选项
[ ] 只移动 (2)
[X] 校验和 (3) - 用户输入的选项
[ ] 重置权限 (4)
[ ] 出口 (5)

选择选项:

我找到了一些选项,但我不知道如何让它们执行某个功能,因为我不明白代码是如何工作的。

更新:

代码功能:

#!/bin/bash

#Sergiy Kolodyaznyy 的贡献代码和 MarianoM 的改编。

resize -s 40 90 > /dev/null #更改窗口大小。

option=$(dialog --clear --backtitle "同步..." --title "同步" \
    --checklist "选择同步选项:" 20 50 10 \
       校验和“比较内容”关闭\
       详细“显示更多信息”关闭\
       \ 上的“同步文件夹”目录
       递归“包括子文件夹”关闭 2>&1 > /dev/tty)

对于我在 $option; do #Set 菜单选项的参数。
       案例 $i 在
         校验和) c="-c" ;;
         详细) v="-v" ;;
         目录) d="-d" ;;
         递归) r="-r" ;;
       经社理事会
     完毕

如果 [ -z $option ]; 然后#检查变量是否为空。如果为空,则表示用户没有选择选项。
 清除
 回声
 echo "错误:未选择任何选项或未安装对话框。程序无法继续。"
 回声  
   别的
 清除
   source=$(dialog --clear --backtitle "请选择源..." --title "源:" --fselect "" 20 50 2>&1 > /dev/tty)
     如果 [ -z $source ]; 然后
       清除
       回声
       echo "错误程序。未选择源,重试!"
       回声
       出口
     菲
 清除
 destination=$(dialog --clear --backtitle "请选择目的地..." --title "目的地:" --fselect "" 20 50 2>&1 > /dev/tty)
     如果 [ -z $destination ]; 然后
       清除
       回声
       echo "错误程序。未选择目的地,重试!"
       回声
       出口
     菲
 清除
 rsync "$c" "$v" "$d" "$r" "$source" "$destination"
 回声
菲
出口
scripts bash
  • 1 1 个回答
  • 5107 Views

1 个回答

  • Voted
  1. Best Answer
    Sergiy Kolodyazhnyy
    2019-01-04T21:55:48+08:002019-01-04T21:55:48+08:00

    从评论中的讨论可以看出,您主要关心的是创建具有多个选择的脚本,而不是专注于复制/移动文件本身,文件操作只是一个示例。这个功能可以通过dialog命令来实现,它允许创建文本用户界面,--checklist特别是标志;但是,标准的纯 shell 工具箱中没有任何东西可以实现您想要的。因此,dialog它是这项工作的合适工具。

    您将在下面找到一个示例脚本。虽然该脚本仅实现了讨论过的 3 个选项,但它提供了一个不错的起点,用户可以进一步扩展,并且还解决了评论中提到的互斥选项。特别是,在函数中解决了多项选择问题menu(),它作为dialogwith--checklist选项的包装器

    为了简单起见,您真正需要的是:

    output=$(dialog --clear --backtitle "Backtitle. Use <SPACE> to select." --title "My Dialog" \
           --checklist "Select all that apply"  50 50 100 \
           checksum "SHA-256" off \
           copy "Copy only (exclusive with move)" off \
           move "Move only (exclusive with copy)" off 2>&1 > /dev/tty)
    

    这会将多个项目的选择保存到 variable $output。请注意,最后的 `2>&1 > /dev/tty) 对于将返回值保存到变量中至关重要。但请参阅下面的脚本以获取更实际的示例:

    #!/bin/bash
    
    puke(){
        # function to exit with specific error message
        # analogous to 'die' in Perl
        printf ">>> Errors were encountered: %s\n" "$1" && exit
    } > /dev/stderr
    
    menu(){
        # dialog --help documents the option as follows:
        # --checklist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
        # tags are what the output returns.
        # We can use word-splitting 
        # and iterate over output of this function in order. Of course first option
        # being checksum will always work and is not mutually exclusive with anything else
        dialog --clear --backtitle "Backtitle. Use <SPACE> to select." --title "My Dialog" \
               --checklist "Select all that apply"  50 50 100 \
               checksum "SHA-256" off \
               copy "Copy only (exclusive with move)" off \
               move "Move only (exclusive with copy)" off || puke
    
    } 2>&1 1>/dev/tty
    
    select_file(){
        dialog --backtitle "Choose file by typing or navigating and selecting with <SPACE>" --fselect "/etc/" \
               20 50  || puke
    } 2>&1 1>/dev/tty
    
    
    iter_actions(){
        # variables are available to child functions
        # Since we call iter_actions in main(), this
        # function also knows about main's variable $fselect
    
        for i ; do 
           case "$i" in
               checksum) sha256sum "$fselect" ;;
               copy) cp "$fselect" /tmp ;;
               move) mv "$fselect" /tmp ;;
           esac
        done
    }
    
    main(){
        # here I'm using /etc but you can use $PWD to default to user's 
        # current working directory, or accept positional parameters from command-line
        # as in $1, $2 and so forth
        fselect=$( select_file "/etc" )
        actions=$(menu) 
        printf "\r%b" "\033c" # this clear the screen
    
        case "$actions" in
           *copy*move|*move*copy) puke "Mutually exclusive options selected" ;;
            *) iter_actions $actions ;; # note here variable is unquoted on purpose
        esac
    }
    
    # script entry point
    main "$@"
    

    进一步研究:

    • 如何在 shell 脚本中创建选择菜单?
    • 如何将对话框输入定向到变量?
    • 为什么要在函数中编写整个 bash 脚本?
    • 3

相关问题

  • 如何每 5 秒运行一次脚本?

  • 如何将必须从其自己的目录中运行的程序添加到面板或主菜单?

  • 如何编写 shell 脚本来安装应用程序列表?

  • Mac OS X Automator 的替代品?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve