![用于检查多个文件路径中输入是否存在的 case 语句语法](https://linux22.com/image/132407/%E7%94%A8%E4%BA%8E%E6%A3%80%E6%9F%A5%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E4%B8%AD%E8%BE%93%E5%85%A5%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E7%9A%84%20case%20%E8%AF%AD%E5%8F%A5%E8%AF%AD%E6%B3%95.png)
我有包含完整企业主机列表(/home/completehostlistcheck.txt
)的输入列表。根据它所在的环境(比较dev=/home/dev.txt
和 的输入prod=/home/prod.txt
)运行echo
并说出它所在的环境。问题是 case 语法不起作用
#!/bin/bash
dev=/home/dev.txt
prod=/home/prod.txt
for host in $(</home/completehostlistcheck.txt)
do
ssh $host
chk=$hostname
case "$chk" in
dev) echo "this is dev"
;;
prod) echo "this is prod"
;;
esac
done
答案1
如果您知道开发主机和生产主机之间的差异,或者有一个简单的命名约定(例如dev.example.com
vs. prod.example.com
),那么这可能很简单:
for host in $(</home/completelistlistcheck.txt); do
case "$(ssh $host hostname)" in
*dev*)
env="development"
break
;;
*prod*)
env="production"
break
;;
*)
env="non-categorized"
break
;;
esac
echo "$host is a $env host."
done
如果每个主机上都有一个您需要解析其内容的文件,请使用cat /path/to/file
而不是hostname
在命令运行中通过ssh
.
答案2
有几个问题:
主机名
除非您的登录确保此变量存在,hostname
否则您应该使用以下命令:
chk=$(hostname)
SSH
ssh $host
只需登录并等待终端输入即可。退出后执行以下命令ssh
。您必须向调用添加命令ssh
。将所有case
内容传递给它会有点多,ssh
但据我了解,您只需要以下结果hostname
:
chk="(ssh "$host" hostname)"