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这样的东西.他们会让你编写更多功能代码,而不必经常与语言搏斗.
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)