bash - 如何在进程替换中使用case/esac?

标签 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参数是否已指定给脚本,如果是,则执行一些命令。

最佳答案

如果你有一个 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/

相关文章:

bash - 重命名文件但将它们保留在当前的子目录中

linux - 历史命令的Bash脚本重定向到Docker容器中的文件

debugging - 如何不忘记删除代码中的调试行

c - 在 C.Fork() 中制作自定义 shell

c++ - 将多个工具作为单个 bash 脚本运行

bash - 如何在包含的 shell 脚本中查找脚本目录

haskell - Haskell中不同数据类型的字段标签之间的名称冲突

syntax - 如何更改箭头类型?

java - 否则没有 if

bash - 如何模拟控制台应用程序的键盘输入?