带有变量和用户输入的案例陈述

Case statement with variables and user input

如何使用带变量的 case 语句?

我正在编写一个 bash 脚本来记录简单信息并将其保存到 csv 文件中。 整个脚本是这样的:您可以选择(使用 case 语句)的选项,这些选项将被记录到一个文件中。在我所在的位置,有一个提示询问用户数量。在日志中,它将是减号或加号。因此,如果我在日志中取出一些东西,它需要说减去一项 (-1),如果我带回一些东西,它应该是 +1 或 +2 或任何数量。

最后,我想在有按钮 0-9# 和 [=25= 的地方使用密码键盘]*。 我想使用选项按钮 * 表示减号,按钮 # 表示加号(我知道我不应该,但显然如果你发表评论他们出来了,它似乎确实有效)。

因此,例如,如果用户按下 *,则用户需要按下一个数字,这将是项目的数量。但是如果用户按错了按钮,我希望脚本忽略它并再次显示 *# 的选项。

最后就像我提到的那样,我需要它全部成为一个变量,我可以回显到该日志。

我开始写它,因为有人帮助我做了类似的事情,但我尝试的事情没有成功。

这只是我想去的地方的想法:

#! /bin/bash


minus="-"
plus="+"

echo "Press * for minus"
echo "Press # for plus"
echo "And then enter the quantity"

read -r choice
#And then comes case I guess.
#!/bin/bash

while true; do

  echo "Press * for minus"
  echo "Press # for plus"
  echo "And then enter the quantity"

  read -r choice </dev/tty

  case $choice in

    '*')    # user input is 'minus' only
      read -r qty </dev/tty    # prompt user to input qty
      if [[ $qty =~ ^[0-9]+$ ]]    # if qty input is only numbers
      then
        echo "-$qty" >> mylog.csv
        break    # break the loop after valid input
      else
        echo "INVALID INPUT" >&2
        # do not break loop
      fi
    ;;

    '#')    # user input is 'plus' only
      read -r qty </dev/tty
      if [[ $qty =~ ^[0-9]+$ ]]
      then
        echo "+$qty" >> mylog.csv
        break
      else
        echo "INVALID INPUT" >&2
      fi
    ;;

    '*'[0-9]*)    # user input is 'minus' followed by at least 1 number
      qty=${choice/#'*'}    # qty is choice without leading symbol
      if [[ $qty =~ ^[0-9]+$ ]]
      then
        echo "-$qty" >> mylog.csv
        break
      else
        echo "INVALID INPUT" >&2
      fi
    ;;

    '#'[0-9]*)    # user input is 'plus' followed by at least 1 number
      qty=${choice/#'#'}
      if [[ $qty =~ ^[0-9]+$ ]]
      then
        echo "+$qty" >> mylog.csv
        break
      else
        echo "INVALID INPUT" >&2
      fi
    ;;

    *)    # any other input or no input
      echo "INVALID INPUT" >&2
      # do not break loop
    ;;

  esac

done