【问题标题】:How to make a command output list into a menu option list with Bash?如何使用 Bash 将命令输出列表变成菜单选项列表?
【发布时间】:2020-05-22 11:23:46
【问题描述】:

如何用 Bash 将命令输出列表变成菜单选项列表?

命令:mount | grep /media | awk '{print $3}' 列出我计算机上所有已安装的 USB 存储设备。

  • 它可能是空的或多行。
  • 当它为空时,我会回显一条消息。
  • 当它是多行时,我想将此输出到菜单选项列表中:

    1. AAA
    2. BBB
    3. CCC
    4. ...

难点在于,输出的行数不是固定的,所以菜单会是不固定的选择。

我被卡住了。

【问题讨论】:

  • 欢迎来到 Stack Overflow。 SO 是面向专业和热情的程序员的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。
  • 您是只针对 LIST 还是 MENU,然后哪个菜单会有其他用途,并且实际上可以选择??

标签: linux bash shell


【解决方案1】:

以下是可行的方法:

#!/bin/sh

output=$(mount|grep /media|awk '{print $3}')

if [[ -z $output ]]; then
    # output is empty
    echo "Empty not found"
else
    # output is not empty
    echo $output
fi

您能否提供您的输出预览,以便我也可以对其进行格式化

【讨论】:

    【解决方案2】:

    如果您真的希望列表项以#) 的方式编号,您可以这样做。

    #!/bin/bash
    
    count=0
    
    for each in $(mount | grep '/media' | awk '{print $3}'); do 
      count=$(( count + 1 ))
      echo "${count}) $each"
    done
    
    if [ "$count" -eq 0 ]; then
      echo "No disks found."
    fi
    
    

    最后的 if 语句触发 if 循环由于零结果而永远不会运行。

    【讨论】:

      【解决方案3】:

      根据您的描述,我了解到您喜欢根据给定的命令输出动态创建菜单或选择列表。一个可能的解决方案可能是这样的

      #!/bin/bash
      
      # Gather the USB drives into an array
      unset DRIVES
      while IFS= read -r LINE; do
        DRIVES+=("${LINE}")
      done < <(mount -l | grep /dev/sd | awk '{print $3}') # < You may change this for your needs ... since I dont have USB in my VM
      
      # Iterate over an array to create select menu
      select USB in "${DRIVES[@]}" "Quit"; do
        case ${USB} in
          /)
            echo "Drive ${USB} selected"
            # Further processing
            ;;
          "Quit")
            echo "Exit"
            break
            ;;
          *)
            echo "Not available"
            ;;
        esac
      done
      

      感谢

      【讨论】:

        【解决方案4】:

        很抱歉回答了一个很老的帖子,但它可能会对某人有所帮助

        #!/bin/bash
        select mntvar in $(mount | grep '/media' | awk '{print $3}'); do break;done
        

        【讨论】:

        • 您的答案可以通过解释您提供的代码来改进。
        猜你喜欢
        • 2012-09-17
        • 2014-09-09
        • 2019-08-07
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多