我一直在尝试通过使用此处的文档将它们嵌套在更大的脚本中来简化一组脚本的安装(因此我仍然可以像普通脚本一样编辑它们)。然而,虽然这里文档中的任何内容都不应该被解释,但我的 shell 似乎偶然发现了不匹配的右括号,例如可以在 case 语句中找到。
例如:
#!/bin/sh
script=$(cat <<- 'NESTED_SCRIPT'
case "$1" in
foo)
echo "Foo"
;;
bar)
echo "Bar"
;;
esac
NESTED_SCRIPT
)
case
除非在语句中的右括号之前放置反斜杠,否则上述操作将在第 6 行失败并出现语法错误。就像由于某种原因,shell 没有等待特殊的 here 文档终止,而是在找到第一个没有相应左括号的右括号后立即终止。不幸的是,转义括号不是一种选择,因为这给我留下了一个脚本,需要从其中删除反斜杠;虽然我可以这样做,但我想如果可以的话,我宁愿避免它。
无论如何,我知道这是一个奇怪的用例,但我不明白为什么它会像这样提前终止。有没有一种方法可以强制它仅以NESTED_SCRIPT
序列终止而不解释括号,或者我可以使用其他一些解决方法?不幸的是,由于我使用它的方式(使用eval
),我需要将脚本分配给一个变量。