Shell脚本Here-document异常,Netcat传输命令中Case语句未执行
排查与修复case语句未执行的问题
看起来你在case语句的逻辑和语法上踩了个常见的坑,咱们一步步拆解问题、解决它:
1. 先纠正case语句的核心错误
你提到的case 'cat log servidor' in写法完全不对——case后面应该跟要匹配的变量/命令输出,而不是直接写你想匹配的字符串。比如你是要判断用户输入的内容是否是cat log servidor,那应该先把输入存到变量里,再用变量做匹配:
# 假设你已经把用户输入写入了文件,先读取到变量里 user_input=$(cat "log servidor") # 注意文件名有空格,必须加引号! # 正确的case写法 case "$user_input" in Cadastrar) echo "执行Cadastrar逻辑..." # 你的处理代码 ;; Entrar) echo "执行Entrar逻辑..." # 你的处理代码 ;; Sair) echo "执行Sair逻辑..." # 你的处理代码 ;; "cat log servidor") # 匹配带空格的字符串,必须加引号 echo "执行查看日志逻辑..." cat "log servidor" # 文件名带空格,也要加引号 ;; *) echo "命令无效,请输入Cadastrar/Entrar/Sair/cat log servidor" ;; esac
2. 检查文件名的空格问题
你的日志文件叫log servidor(带空格),这会导致很多命令解析错误:比如直接写cat log servidor会被系统当成cat读取两个文件(log和servidor),而不是一个叫log servidor的文件。强烈建议把文件名改成log_servidor或者log-servidor,避免空格带来的麻烦;如果一定要保留空格,所有涉及这个文件的命令都必须用双引号包裹文件名。
3. 验证netcat的传输逻辑
服务器用netcat发送多行命令时,要确保换行符正确传递,客户端能逐行接收:
- 服务器端发送多行内容可以用
echo -e或者printf:# 服务器端示例:发送可选命令列表 echo -e "Cadastrar\nEntrar\nSair\ncat log servidor" | nc 客户端IP 端口号 - 客户端接收时,要用循环逐行处理,避免多行内容被当成一个整体:
# 客户端示例:接收服务器的命令并处理 nc 服务器IP 端口号 | while read -r input_line; do # 把输入写入日志文件 echo "$input_line" > "log servidor" # 用case判断输入 case "$input_line" in # 各个分支逻辑... esac done
4. 调试小技巧
如果还是没执行,加一些调试输出确认变量值:
user_input=$(cat "log servidor") echo "当前输入内容是:'$user_input'" # 打印变量值,看是否和预期一致 case "$user_input" in # ...你的分支 esac
这样就能快速定位是输入没正确写入文件,还是case匹配逻辑有问题。
内容的提问来源于stack exchange,提问作者henriquehbr




