2

我有以下行可以正常工作:

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)语法在 GNU bash 3.2.57(t)中有效,但在 4.3.42 中无效。

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

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

但是我不想使用该语法,因为它已弃用

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

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

基本上是检查是否-t已经为脚本指定了参数,如果是,则执行一些命令。

4

2 回答 2

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),从而导致括号平衡。这是POSIX sh 标准中明确允许的语法

于 2015-12-29T01:06:32.607 回答
2

但是,您要完成什么?[...和]命令替换很可能可以避免。也许这就是您正在寻找的:

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

while循环的退出状态就是语句case的退出状态。无需将其包装起来[来检查它是否正确,这通常是一种反模式。

于 2015-12-29T10:55:58.683 回答