我有以下行可以正常工作:
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
参数是否已指定给脚本,如果是,则执行一些命令。
最佳答案
如果你有一个 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 .
关于bash - 如何在进程替换中使用case/esac?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502492/