我的下一行工作正常:
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
参数并执行某些命令(如果是)。
答案 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
语句的退出状态。没有必要在[
中包含它来检查它是否真实,反正经常是反模式。