bash case语句评估为字符串

mba*_*768 11 bash functional-programming notation case-statement

我已经发现了函数式编程错误,所以自然对我来说已经不够了.;)

所以,在bash中可以写:

case $status in
  "foo") status="bar" ;;
  "baz") status="buh" ;;
   *) status=$status ;;
esac
Run Code Online (Sandbox Code Playgroud)

但我害怕拼写错误,所以我更愿意写:

status=case $status in
  "foo") "bar" ;;
  "baz") "buh" ;;
  *) $status ;;
esac
Run Code Online (Sandbox Code Playgroud)

第二种形式是无效的,因为案例评估了最后执行的命令的退出代码,这完全不是我正在寻找的.

有没有简单的黑客实现什么,我正在找?

Lau*_*ves 12

如果您确定状态只是一行,您可以使用sed执行以下操作:

status=$(echo "$status" | sed -e 's:^foo$:bar:' -e 's:^baz$:buh:')
Run Code Online (Sandbox Code Playgroud)

您也可以使用bash的内置替换来处理某些事情.这几乎可以工作(我不知道有什么方法可以得到完全匹配):

status=${status/foo/bar}
status=${status/baz/buh}
Run Code Online (Sandbox Code Playgroud)

如果你的目标只是为了更加"实用"(而不是让你的代码更具有防错性),你可以这样做:

status=$(
  case "$status" in
    ("foo") echo "bar" ;;
    ("baz") echo "buh" ;;
    (*) echo "$status" ;;
  esac)
Run Code Online (Sandbox Code Playgroud)

虽然老实说,bash可能是最难尝试和功能化的语言之一.它的确设计具有更强制性的思维模式,正如你无法轻易编写表达式所说明的那样.在第二个代码片段中看到我如何将其分成两个单独的语句?如果bash被设计为功能性的,你可以写下这样的东西:

status=${{status/baz/buh}/foo/bar}
Run Code Online (Sandbox Code Playgroud)

但是,这并不能正常工作.

我建议只使用bash来处理更简单的脚本,对于更复杂的东西,我会使用像Python或Ruby这样的东西.他们会让你编写更多功能代码,而不必经常与语言搏斗.

  • @ mbac32768据我所知,我确实回答了你的问题,实际上是三次.如果您不同意,也许您需要重新提出问题,或者您至少可以解释为什么这些解决方案不适合您.当有人努力帮助你时会变得嗤之以鼻,这有点蹩脚. (13认同)
  • @ mbac32768你有没有问过如何以函数方式编写switch语句?我没有告诉你三种选择吗?至于指出你不应该尝试在bash中进行功能编程,对于Stack Overflow上的答案来说,退一步并指出当问题表明更大的问题时,这是很常见的.如果发现你在花园小径上散步会伤害你的感受,那么也许你不应该在Stack Overflow上提问,或者你可以学会处理建设性的批评. (4认同)

gho*_*g74 5

status="baz"
status=$(case $status in
  "foo") echo "bar" ;;
  "baz") echo "buh" ;;
  *) echo $status ;;
esac)
echo "status: $status"
Run Code Online (Sandbox Code Playgroud)

输出

$ ./shell.sh
status: buh
Run Code Online (Sandbox Code Playgroud)