【问题标题】:What is the idiomatic way to handle shortcut of an argument in Bash在 Bash 中处理参数快捷方式的惯用方法是什么
【发布时间】:2020-01-21 00:29:37
【问题描述】:

我正在编写一个脚本,它接受决定进一步执行的参数。参数是完整的单词 (script.sh guess) 和它们的快捷方式 (script.sh g)。 注释行是我找到的第一种方式,第二条ifmy 更灵活的方式。无论如何,我很想听听有经验的人的意见。

另外,我想知道。有没有办法构建正则表达式,使其只需要gguess,而不是gue 等部分?

#if [[ $1 == guess || $1 == g ]]; then 
if [[ $1 =~ [guess] ]]; then
    printf "You won!"
else
    printf "You lost!"
fi

您的首选方法是什么?我似乎找不到合适的术语来让大 G 在这里找到答案。

【问题讨论】:

  • case "$1" in g|guess) ?我相信=~ [guess] 不会像你想的那样做。
  • @KamilCuk 你是对的,它没有。它接受包含列表[guess] 的任何成员的任何参数。我完全错过了,也没有测试过。 case 按预期工作。谢谢。

标签: bash shell syntax


【解决方案1】:
case $1 in
   [Gg]|[Gg]uess) printf 'You won!\n';;
    *) printf 'You lost!\n' >&2;;
esac

它应该匹配GgGuessguess。虽然[Gg][Uu][Ee][Ss][Ss] 可能是极端的,但它应该可以工作,在bash 中还有nocasematch shell 选项。

【讨论】:

  • 这完全符合我的要求(而且效果更好)。谢谢!
  • 很高兴知道,还有一个额外的好处是语法不是特定于 bash 的,它应该可以在 dash、busybox、sh 等 POSIX shell 上工作。它还可以在 zsh、mksh 上运行而没有问题。
【解决方案2】:

你所描述的正则表达式是

if [[ $1 =~ g(uess)? ]]; then  # accept g or guess

对于任何前缀,它都是

if [[ $1 =~ g(u(e(ss?)?)?)? ]]; then

【讨论】:

  • 这实际上是按预期方式工作的,与我使用的列表不同。谢谢。
猜你喜欢
  • 2014-01-28
  • 2011-06-20
  • 2015-12-13
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多