【问题标题】:Case statement with variables and user input带有变量和用户输入的案例语句
【发布时间】:2021-08-28 19:56:58
【问题描述】:

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

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

最后,我想使用一个带有按钮 0-9#* 的密码键盘。 我想将 * 按钮用作选项按钮,将按钮 # 用作加号(我知道我不应该,但显然如果您将它们注释掉,它似乎工作)。

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

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

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

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

#! /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.

【问题讨论】:

  • 请用things I tried didn't work out更新问题,否则看起来您希望我们为您编写整套代码;还...用户可以输入多位数答案(例如23)还是仅限于一次输入一个数字? read 要求用户点击<return_or_enter> 来告诉read 当数据输入完成时,用户是否必须点击<return_or_enter> 或者您是否希望read 将每个按键作为单独的按键处理条目(例如,read -n1)?
  • 一点也不。我只是跳过了那个,因为我对我的代码不起作用感到尴尬:
  • ``` 把它想象成一个对仓库来说很重要的日志。所以是的,如果有人拿了 67 个项目,日志需要有这个 -67 个项目回显给它。退货或进出价已经整理好。就像脚本的最后一行将看起来像... 输出字符。我会回来的。
  • 所以还有其他 $(thing) 之类的变量,它们在脚本的早期工作。但最后,我认为脚本将以这样的行结束: echo $var1thatworked $var2thatworkier $userNumber $thingsI'mstrugglingWith >> mylog.csv

标签: bash loops raspberry-pi case


【解决方案1】:
#!/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

【讨论】:

  • 这太不可思议了......但如果你不介意的话。当我取消注释#done 时,它​​返回:line 63: syntax error near unexpected token done'`
  • 如果你想循环它,你还需要取消注释顶部附近的行,while true; do
  • 我有点不知所措,我很想念它。如果用户输入了错误的 inut,我想循环它。因此,例如,如果用户输入 nnumber 2 而不是 * 或 # 那么脚本将再次提示选项 - 否则 - 它只会继续前进并记录值。有办法吗?
  • 我编辑了代码,现在它应该做你想做的事。如果这是您正在寻找的解决方案,如果您“接受”我的回答,我将不胜感激
  • 如果你不介意:你为什么在这里使用 /dev/tty?我试图阅读它,但我不确定我是否理解正确。关于 >&2 的相同问题。为什么它们很重要?不添加这么多答案,我只想说,一百万年后我自己永远也弄不明白。我永远不会认为需要这么多代码。感谢您抽出宝贵时间,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多