微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash:嵌套选择菜单,仅第一个选择有效,第二个选择无效

如何解决bash:嵌套选择菜单,仅第一个选择有效,第二个选择无效

我的脚本中有两个功能,两个都是嵌套在其中的“选择”菜单。 他们两个都起作用,但只能是第一个选择,而不是第二个选择。 我显然对他们俩都做错了。 现在,我将仅提供我的一个功能,因为我猜我在两个功能上都犯了相同的错误

问题:一个菜单的第一部分(“ 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
}

解决方法

假设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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。