如何在流程替换中使用case / esac?

时间:2015-12-28 23:52:00

标签: bash shell syntax syntax-error command-substitution

我的下一行工作正常:

while getopts :t t; do case $t in t) echo $t; break; esac; done

但是,当我尝试将其用作命令替换时,bash会失败并显示错误。

代码:

#!/usr/bin/env bash
echo $BASH_VERSION
[ "$(while getopts :t t; do case $t in t) echo $t; break; esac; done)" = "t" ] && echo "Option specified."

结果:

$ ./test.sh -a -b -c -t
4.3.42(1)-release
./test.sh: line 3: unexpected EOF while looking for matching `"'
./test.sh: line 4: syntax error: unexpected end of file

\)中的反斜杠t)并没有帮助。 (t)语法在GNU bash 3.2.57中有效,但它不在4.3.42中。

似乎使用反引号适用于两个版本:

[ "`while getopts :t t; do case $t in t) echo $t; break; esac; done`" = "t" ] && echo "Option specified."

但我不想使用该语法deprecated

如何在上述命令替换(case)中使用$()语法?

或许还有其他方法可以做同样的事情?

基本上检查是否已为脚本指定-t参数并执行某些命令(如果是)。

2 个答案:

答案 0 :(得分:3)

如果你有一个版本的bash,其中扫描仪被破坏的方式只能终止于一个不平衡的) - 一个当前4.3中不再存在的错误 - 你可以解决它如下:

#!/usr/bin/env bash
[ "$(while getopts :t t; do case $t in (t) echo $t; break;; esac; done)" = "t" ] && echo "Option specified."

这里的关键区别是使用(t)而不是t),从而导致括号平衡。这是syntax explicitly allowed in the POSIX sh standard

答案 1 :(得分:2)

但是你想要完成什么?最有可能避免使用[ ... ]和命令替换。也许这就是你要找的东西:

while getopts :t t; do
  case $t in t) true; break;; *) false;; esac
done && echo Yes || echo No

while循环的退出状态是case语句的退出状态。没有必要在[中包含它来检查它是否真实,反正经常是反模式。