使用数组参数创建bash选择菜单

时间:2015-02-04 16:04:25

标签: arrays bash argument-passing

我有一个名为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[@]}

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

1 个答案:

答案 0 :(得分:2)

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

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[@]}"