使用数组参数创建 bash select 菜单
Create bash select menu with array argument
我有一个名为 createmenu
的函数。这个函数将一个数组作为第一个参数。第二个参数将是数组的大小。
然后我想使用该数组的元素创建一个 select 菜单。这是我目前所拥有的:
用给定的数组创建菜单
createmenu ()
{
echo
echo "Size of array: "
select option in ; do
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[*]} ${#buckets[@]}
如何使用参数数组的元素作为选项来创建此 select 菜单?
我的建议是颠倒参数的顺序(尽管您甚至不需要长度参数,但我们会讲到)然后将数组作为位置参数传递给函数。
createmenu ()
{
arrsize=
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[@]}"
我有一个名为 createmenu
的函数。这个函数将一个数组作为第一个参数。第二个参数将是数组的大小。
然后我想使用该数组的元素创建一个 select 菜单。这是我目前所拥有的:
用给定的数组创建菜单
createmenu ()
{
echo
echo "Size of array: "
select option in ; do
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[*]} ${#buckets[@]}
如何使用参数数组的元素作为选项来创建此 select 菜单?
我的建议是颠倒参数的顺序(尽管您甚至不需要长度参数,但我们会讲到)然后将数组作为位置参数传递给函数。
createmenu ()
{
arrsize=
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[@]}"