linux - 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
解决方案
您的 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。
推荐阅读
- javascript - 屏幕安装后如何调用函数?
- typescript - firebase 函数的问题,它在异步函数中返回未定义的值
- bash - 如何将通配符添加到变量以传递给“执行 shell 脚本”?
- r - 去除因子后堆积条形图标签发生变化(ggplot2)
- azure-ad-b2c - Azure B2C 服务条款流程 - 存储文本和可合法验证的用户协议
- reactjs - FirebaseUI React:允许用户在不提供名字/姓氏的情况下通过电子邮件+密码进行注册
- xamarin - 在 MVVM 中使用带有 ObservableCollection 的 SearchBar
- flutter - 如何在颤振中添加另一个可重新排序的列表视图
- operation - 这条线有多少基本操作?
- c++ - 在 ABC C++ 中修改重载的 << 运算符