Shell 文件中的结束括号
我一直试图通过使用here文档将一组脚本嵌套在一个更大的脚本中来简化脚本的安装(因此我仍然可以像普通脚本一样编辑它们)。然而,尽管here文档中没有任何内容应该被解释,但是我的shell似乎遇到了不匹配的结束括号,比如case语句 例如:Shell 文件中的结束括号,shell,Shell,我一直试图通过使用here文档将一组脚本嵌套在一个更大的脚本中来简化脚本的安装(因此我仍然可以像普通脚本一样编辑它们)。然而,尽管here文档中没有任何内容应该被解释,但是我的shell似乎遇到了不匹配的结束括号,比如case语句 例如: #!/bin/sh script=$(cat <<- 'NESTED_SCRIPT' case "$1" in foo) echo "Foo" ;; bar)
#!/bin/sh
script=$(cat <<- 'NESTED_SCRIPT'
case "$1" in
foo)
echo "Foo"
;;
bar)
echo "Bar"
;;
esac
NESTED_SCRIPT
)
#/垃圾箱/垃圾箱
script=$(catOP中的解决方案在Linux中工作,但在osx中不工作
将here文档分配给变量的正确方法如下:
read -r -d '' script <<- 'NESTED_SCRIPT'
... # your nested script...
NESTED_SCRIPT
ssh myserver bash < script.sh
ssh myserver bash -s arg1 arg2 < script.sh
您可以在另一个问题中找到更多详细信息和建议:
但是…
如果您只想重复使用同一脚本在本地和远程运行,有一种比在远程端使用eval
更好的方法。您可以在远程服务器上运行本地脚本,如下所示:
read -r -d '' script <<- 'NESTED_SCRIPT'
... # your nested script...
NESTED_SCRIPT
ssh myserver bash < script.sh
ssh myserver bash -s arg1 arg2 < script.sh
ssh myserver bash
如果要将命令行参数传递给脚本,可以执行以下操作:
read -r -d '' script <<- 'NESTED_SCRIPT'
... # your nested script...
NESTED_SCRIPT
ssh myserver bash < script.sh
ssh myserver bash -s arg1 arg2 < script.sh
ssh myserver bash-s arg1 arg2
OP中的解决方案可以在Linux中工作,但不能在osx中工作
将here文档分配给变量的正确方法如下:
read -r -d '' script <<- 'NESTED_SCRIPT'
... # your nested script...
NESTED_SCRIPT
ssh myserver bash < script.sh
ssh myserver bash -s arg1 arg2 < script.sh
您可以在另一个问题中找到更多详细信息和建议:
但是…
如果您只想重复使用同一脚本在本地和远程运行,有一种比在远程端使用eval
更好的方法。您可以在远程服务器上运行本地脚本,如下所示:
read -r -d '' script <<- 'NESTED_SCRIPT'
... # your nested script...
NESTED_SCRIPT
ssh myserver bash < script.sh
ssh myserver bash -s arg1 arg2 < script.sh
ssh myserver bash
如果要将命令行参数传递给脚本,可以执行以下操作:
read -r -d '' script <<- 'NESTED_SCRIPT'
... # your nested script...
NESTED_SCRIPT
ssh myserver bash < script.sh
ssh myserver bash -s arg1 arg2 < script.sh
ssh myserver bash-s arg1 arg2
语法错误的原因是脚本中的第一个)
关闭了进程替换。通常,我会建议避免像瘟疫一样的倒勾,并使用$()
语法。但在这种情况下
#!/bin/sh
script=`cat <<- 'NESTED_SCRIPT'
case "$1" in
foo)
echo "Foo"
;;
bar)
echo "Bar"
;;
esac
NESTED_SCRIPT
`
#/垃圾箱/垃圾箱
script=`cat语法错误的原因是脚本中的第一个)
关闭了进程替换。通常,我会建议避免像瘟疫一样的倒勾,并使用$()
语法。但在这种情况下
#!/bin/sh
script=`cat <<- 'NESTED_SCRIPT'
case "$1" in
foo)
echo "Foo"
;;
bar)
echo "Bar"
;;
esac
NESTED_SCRIPT
`
#/垃圾箱/垃圾箱
script=`catPOSIX标准允许在大小写条目中使用前导括号来平衡最后一个括号,因此您可以通过这种方式修复脚本:
#!/bin/sh
script=$(cat <<- 'NESTED_SCRIPT'
case "$1" in
(foo)
echo "Foo"
;;
(bar)
echo "Bar"
;;
esac
NESTED_SCRIPT
)
#/垃圾箱/垃圾箱
script=$(catPOSIX标准允许在大小写条目中使用前导括号来平衡最后一个括号,因此您可以通过这种方式修复脚本:
#!/bin/sh
script=$(cat <<- 'NESTED_SCRIPT'
case "$1" in
(foo)
echo "Foo"
;;
(bar)
echo "Bar"
;;
esac
NESTED_SCRIPT
)
!/bin/sh
script=$(cat我不确定问题出在哪里,但是如果脚本不包含单引号(单引号字符串可以包含嵌入的换行符),则可以选择script='…'
)。如果是这样,一些shell支持script=$'…'
,任何单引号转义为\'
eval
通常是最后的手段;您可以发布更多上下文吗?也许有人可以建议一种替代方法(尽管找出语法错误发生的原因会很有趣)。我的脚本也使用ssh
在远程服务器上运行命令,但我需要执行的某些操作需要相同的函数,因此我决定将它们打包成字符串,以便在本地评估它们,并将它们发送到远程执行。@mbrach backticks看起来确实有效,但整个here文档显示为string在我尝试过的所有编辑器中,但这似乎是多余的,因为我认为您定义的特殊序列应该是终止here文档的唯一方法?我不确定问题出在哪里,但是如果您的脚本不包含单引号(单引号字符串可以包含嵌入的换行符),则script='…'
是一个选项。如果是这样,一些shell支持script=$'…'
,任何单引号转义为\'
eval
通常是最后的手段;您可以发布更多上下文吗?也许有人可以建议一种替代方法(尽管找出语法错误发生的原因会很有趣)。我的脚本也使用ssh
在远程服务器上运行命令,但我需要执行的某些操作需要相同的函数,因此我决定将它们打包成字符串,以便在本地评估它们,并将它们发送到远程执行。@mbrach backticks看起来确实有效,但整个here文档显示为stri在我尝试过的所有编辑器中使用ng,但这似乎是多余的,因为我认为您定义的特殊序列应该是终止here文档的唯一方法?我很想这样做,但不幸的是,我的要求之一是只使用一个脚本,尽管我可能会研究将我的值吐出到临时文件中。原始p使用read
的问题听起来很好,在OS X上也很好,但我发现我瞄准的一些设备不支持-d
参数,而且我使用IFS
无法获得相同的效果,有什么想法吗?@haravik那真的太糟糕了。最好使用我最后的建议使用ssh-server-bash
。我为您添加了一个没有read-d
的想法,请参阅我的更新答案。但是,如果您使用#!/bin/bash
作为shebang,那么read-d
应该可以工作。感谢添加了循环方法,不幸的是,它似乎遇到了另一个类似的问题,至少在我尝试的系统中是这样的它需要特殊字符的双重转义,例如,如果嵌套脚本包含sed
表达式,尽管我意识到我的示例中没有任何表达式。我认为@jlliagre的答案可能是我问题的最正确答案,尽管在适用的情况下,你的答案是更好的。@haravik足够公平,不用担心;-)我很想这样做,但不幸的是,我的要求之一是只使用一个脚本,尽管我可能会研究将我的值吐出到临时文件中