【问题标题】:Create bash select menu with array argument使用数组参数创建 bash 选择菜单
【发布时间】:2023-03-09 20:24:01
【问题描述】:

我有一个名为createmenu 的函数。该函数将接收一个数组作为第一个参数。第二个参数将是数组的大小。

然后我想使用该数组的元素创建一个选择菜单。这是我目前所拥有的:

使用给定数组创建菜单

createmenu ()
{
  echo $1
  echo "Size of array: $2"
  select option in $1; do
    if [ $REPLY -eq $2 ];
    then
      echo "Exiting..."
      break;
    elif [1 -le $REPLY ] && [$REPLY -le $2-1 ];
    then
      echo "You selected $option which is option $REPLY"
      break;
    else
      echo "Incorrect Input: Select a number 1-$2"
    fi
  done
}

这是对函数的示例调用:

createmenu ${buckets[*]} ${#buckets[@]}

如何使用参数数组的元素作为选项来创建这个选择菜单?

【问题讨论】:

    标签: arrays bash argument-passing


    【解决方案1】:

    我的建议是颠倒你的参数的顺序(虽然你甚至不需要长度参数,但我们会做到这一点),然后将数组作为位置参数传递给函数。

    createmenu ()
    {
      arrsize=$1
      echo "Size of array: $arrsize"
      echo "${@:2}"
      select option in "${@:2}"; do
        if [ "$REPLY" -eq "$arrsize" ];
        then
          echo "Exiting..."
          break;
        elif [ 1 -le "$REPLY" ] && [ "$REPLY" -le $((arrsize-1)) ];
        then
          echo "You selected $option which is option $REPLY"
          break;
        else
          echo "Incorrect Input: Select a number 1-$arrsize"
        fi
      done
    }
    
    createmenu "${#buckets[@]}" "${buckets[@]}"
    

    请注意,我还修复了您的函数中的几个错误。也就是说,您在 [ 和第一个参数之间遗漏了一些空格,并且 [ 不是算术上下文,因此您需要强制一个以使您的数学工作)。

    但回到我之前关于根本不需要长度参数的评论。

    如果您使用数组元素的位置参数,那么您已经在$# 中拥有长度...并且可以使用它。

    createmenu ()
    {
      echo "Size of array: $#"
      echo "$@"
      select option; do # in "$@" is the default
        if [ "$REPLY" -eq "$#" ];
        then
          echo "Exiting..."
          break;
        elif [ 1 -le "$REPLY" ] && [ "$REPLY" -le $(($#-1)) ];
        then
          echo "You selected $option which is option $REPLY"
          break;
        else
          echo "Incorrect Input: Select a number 1-$#"
        fi
      done
    }
    
    createmenu "${buckets[@]}"
    

    【讨论】:

    • 工作就像一个魅力!我可以问一些澄清的问题吗?为什么要在$REPLY 周围加上引号?另外,${@:2} 到底在做什么?最后,为什么$((arrsize-1))周围的双括号
    • 通常总是引用变量扩展。是不是更安全。如果用户在提示符下输入will this break 怎么办? $(( ))Arithmetic Expansion 你需要它来让 shell 在那里做数学运算(否则 $arrsize-1 只是扩展为 2-1 或其他)。 "${@:2}"Substring Expansion,这意味着所有位置参数都从第二个开始(而不是 "$@",它是所有位置参数)。
    • 在我的例子中,我必须在 done 行之后添加它以获得我期望的值:` let REPLY=(REPLY-1) # menu started at 1, 所以我们必须减去一个`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多