Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 文件中的结束括号_Shell - Fatal编程技术网

Shell 文件中的结束括号

Shell 文件中的结束括号,shell,Shell,我一直试图通过使用here文档将一组脚本嵌套在一个更大的脚本中来简化脚本的安装(因此我仍然可以像普通脚本一样编辑它们)。然而,尽管here文档中没有任何内容应该被解释,但是我的shell似乎遇到了不匹配的结束括号,比如case语句 例如: #!/bin/sh script=$(cat <<- 'NESTED_SCRIPT' case "$1" in foo) echo "Foo" ;; bar)

我一直试图通过使用here文档将一组脚本嵌套在一个更大的脚本中来简化脚本的安装(因此我仍然可以像普通脚本一样编辑它们)。然而,尽管here文档中没有任何内容应该被解释,但是我的shell似乎遇到了不匹配的结束括号,比如case语句

例如:

#!/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足够公平,不用担心;-)我很想这样做,但不幸的是,我的要求之一是只使用一个脚本,尽管我可能会研究将我的值吐出到临时文件中