You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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读取两个文件(logservidor),而不是一个叫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

火山引擎 最新活动