【问题标题】:bash: nested select menu, only first selection works, the second selection doesntbash:嵌套选择菜单,只有第一个选择有效,第二个选择无效
【发布时间】:2020-09-30 04:04:45
【问题描述】:

我的脚本中有两个函数,都是“选择”菜单,其中嵌套了其他“选择”菜单。 它们都有效,但只有第一个选择,而不是第二个选择。 我显然对他们俩都做错了。 现在,我将只提供我的一个函数,因为我猜我在这两个函数上都犯了同样的错误。

问题: 第一个菜单的所有第一部分(“Stream”)都可以正常工作,但第二部分(“Download”)却不行。

为什么它不起作用?我做错了什么??

#!/bin/env bash

MAIN(){
  echo "Stream Or Download?"
  select S_D in 'Stream' 'Download'; do
    case $S_D in
    Stream)
      echo "Audio Or Video?"
      select A_V in 'Audio' 'Video'; do
        case $A_V in
        Audio)
          if [[ "$DOMAIN" =~ 'youtube' ]]; then
            mpv --no-video "$URL"
          else
            streamlink --player='mpv --no-video' "$URL" 720p|& tee /dev/null
          fi
          break 2 ;;
        Video)
          if [[ "$DOMAIN" =~ 'youtube' ]]; then
            am start -a android.intent.action.VIEW -d "$(youtube-dl -f best -g "$URL")" -n is.xyz.mpv/.MPVActivity &> /dev/null
          else
            am start -a android.intent.action.VIEW -d "$(streamlink "$URL")" -n is.xyz.mpv/.MPVActivity &> /dev/null
          fi
          break 2 ;;
    Download)
      echo "Song? Album? Playlist?"
      select S_A_P in 'Song' 'Album' 'Playlist'; do
        case $S_A_P in
        Song)
          echo "Enter Artist:"
          read ARTIST
          echo "Enter Song:"
          read SONG
            youtube-dl --extract-audio --prefer-ffmpeg --audio-format m4a --output "$MUSIC_DIR/$ARTIST - $SONG.%(ext)s" "$URL"
            mid3v2 -v -a "$ARTIST" -S "$SONG" "$MUSIC_DIR/$ARTIST - $SONG.m4a"
            break 2 ;;
        Album)
          echo "Enter Artist:"
          read ARTIST
          echo "Enter Album:"
          read ALBUM
            youtube-dl --extract-audio --prefer-ffmpeg --audio-format m4a --output "$MUSIC_DIR/$ARTIST - $ALBUM.%(ext)s" "$URL"
            mid3v2 -v -a "$ARTIST" -A "$ALBUM" "$MUSIC_DIR/$ARTIST - $ALBUM.m4a"
            break 2 ;;
        Playlist)
          echo "Enter Artist/DJ Or Leave It Empty:"
          read ARTIST
          echo "Enter A Title:"
          read TITLE
          if [[ -z "$ARTIST" ]]; then
            youtube-dl --extract-audio --prefer-ffmpeg --audio-format m4a --output "$MUSIC_DIR/$TITLE.%(ext)s" "$URL"
            mid3v2 -v -A "$TITLE" "$MUSIC_DIR/$TITLE.m4a"
          else
            youtube-dl --extract-audio --prefer-ffmpeg --audio-format m4a --output "$MUSIC_DIR/$ARTIST - $TITLE.%(ext)s" "$URL"
            mid3v2 -v -a "$ARTIST" -A "$TITLE" "$MUSIC_DIR/$ARTIST - $TITLE.m4a"
          fi
          break ;;
      esac
      done
      break ;;
    esac
    done
    break ;;
  esac
  done
}

【问题讨论】:

  • 这里有很多额外的代码。只需要一个选择和一个嵌套选择来说明问题。这是关于 read 从 std-in 读取的内容,您必须重定向一个额外的流来读取第二个选择,但我不太确定如何。我敢肯定,其中一位 bash 大师会让您直截了当。好主意,祝你好运!

标签: bash function shell select


【解决方案1】:

假设 case $A_V 块只有 2 个选项(AudioVideo),则匹配的 esac 语句位于错误的位置(凌乱的缩进无济于事):

    case $S_D in
    Stream)
        ...
        case $A_V in
        Audio)
          ...
        Video)
          ...
                            # `esac` for `case $A_V` should reside on this line
    Download)
        ...
        case $S_A_P in
        Song)
        ...
        Album)
        ...
        Playlist)
        ...
      esac                  # first esac closes `case $S_A_P`
      ...
    esac                    # second esac closes `case $A_V` **THIS IS THE PROBLEM! THIS NEEDS TO BE MOVED JUST BEFORE THE ** `Download` **LINE.**
    ...
  esac                      # last esac closes `case $S_D`

注意: OP 还需要将关联的 done/break 语句与 esac 语句一起移动

原因: 每个单独的select 菜单必须在最后以esac/done 结束,否则将不会继续下一个选择。 OP 没有正确关闭case $A_V

【讨论】:

  • 现在完美运行!太感谢了! @markp-fuso
猜你喜欢
  • 2015-02-15
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多