首页 > 解决方案 > Shell 脚本中的嵌套 Case 语句 | 获取语​​法错误

问题描述

我正在尝试在 shell 脚本下运行,但出现语法错误。

script.sh env1 ManagedSvr1 第 29 行:警告:here-document 在第 6 行,由文件结尾分隔(需要“EOF”)第 30 行:语法错误:您意外的文件结尾

#!/bin/bash
case "$1" in "env1")
ssh  weblogic@hostname1 << EOF
    case "$server" in
    "ManagedSvr1")
            tailf /app/Oracle/Middleware/domains/dq/servers/ManagedSvr1/logs/ManagedSvr1.log
    ;;
    "ManagedSvr2")
            tailf /app/Oracle/Middleware/domains/dq/servers/ManagedSvr2/logs/ManagedSvr2.log
    ;;
    esac
;;
"env2")
    ssh  weblogic@hostname2 << EOF
    case "$server" in
    "ManagedSvr1")
            tailf /app/Oracle/Middleware/domains/dq/servers/ManagedSvr1/logs/ManagedSvr1.log
    ;;
    "ManagedSvr2")
            tailf /app/Oracle/Middleware/domains/dq/servers/ManagedSvr2/logs/ManagedSvr2.log
    ;;
    esac
;;
esac

标签: linuxbashshellscripting

解决方案


您的 Here Docs 指定 EOF 来结束它们(<< EOF),但您永远没有 EOF 来结束它们。请注意,EOF 并不意味着文件结束,它意味着字符串'EOF'。 https://en.wikipedia.org/wiki/Here_document有示例。

我不确定您希望完成什么,但在我看来您需要指定要跟踪的文件。您是否希望将内壳传递到您要进入的服务器上的远程外壳中?它会简化你的代码,先设置你的文件名和服务器名,然后 ssh 并执行命令。实际上,无论如何,我在您的内部案例陈述中看不到太多目的。您可以将主机名设置为变量,而不是将所有内容都包装在“env”案例中。然后可以将“服务器名”插入到文件系统路径中。这样的事情似乎是一个简单的方法:

#!/bin/bash
case "$1" in
env1)
  hostname="hostname1"
;;
env2)
  hostname="hostname2"
;;
esac
echo ssh weblogic@$hostname tailf  /app/Oracle/Middleware/domains/dq/servers/$servername/logs/$servername.log

似乎工作简单直接:

servername=ManagedSvr1 ./t.sh env1
ssh weblogic@hostname1 tailf /app/Oracle/Middleware/domains/dq/servers/ManagedSvr1/logs/ManagedSvr1.log

取出“echo”来实际执行 ssh。


推荐阅读