You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何将Zenity GUI输入传入Bash脚本的latencyms变量

实现Zenity GUI传递参数给网络延迟Bash脚本

完全可以简单实现,只需要把Zenity获取到的输入变量直接代入原脚本的逻辑中,同时增加一些友好的输入校验和提示即可。以下是整合后的完整脚本:

#!/bin/bash

# 定义要操作的网络接口,根据你的树莓派实际接口名修改
INTERFACES=("enp5s0" "enp0s31f6")

# 弹出GUI输入框获取延迟值,默认填充35ms作为示例
latencyms=$(zenity --entry --title="设置单网卡模拟延迟" --text="请输入单网卡的模拟延迟值(单位:毫秒,例如35):" --entry-text="35")

# 判断用户是否取消输入或输入为空
if [ -z "$latencyms" ]; then
    zenity --error --text="未输入有效延迟值,操作已取消"
    exit 1
fi

# 验证输入是否为纯数字,避免非法输入导致脚本出错
if ! [[ "$latencyms" =~ ^[0-9]+$ ]]; then
    zenity --error --text="输入无效,请输入纯数字的延迟值"
    exit 1
fi

# 清除原有延迟规则,忽略无规则时的错误提示
zenity --info --text="正在清除现有网卡延迟规则..." --no-wrap
for iface in "${INTERFACES[@]}"; do
    sudo tc qdisc del dev "$iface" root netem 2>/dev/null
done

# 为所有目标网卡设置新的延迟值
zenity --info --text="正在为网卡设置${latencyms}ms延迟..." --no-wrap
for iface in "${INTERFACES[@]}"; do
    sudo tc qdisc add dev "$iface" root netem delay "${latencyms}ms"
done

# 完成后弹出成功提示
zenity --info --text="已成功为以下网卡设置${latencyms}ms延迟:\n${INTERFACES[*]}" --no-wrap

关键说明

  • 参数传递逻辑:通过latencyms=$(zenity --entry ...)直接获取用户GUI输入,后续在tc命令中直接引用该变量,和原脚本的变量使用方式完全一致,只是替换了输入来源。
  • 输入校验:增加了空值判断和数字格式校验,避免用户误操作或输入非法值导致脚本异常,同时用Zenity弹窗给出直观提示。
  • 接口批量管理:将网卡名存入数组,后续修改接口只需调整数组内容,无需在多个代码位置重复修改。
  • 权限处理:执行tc命令需要sudo权限,运行脚本时系统会自动弹出密码输入框(如果当前用户未配置sudo免密),属于正常的权限要求。
  • 错误屏蔽:删除原有规则时添加2>/dev/null,避免网卡原本没有延迟规则时输出错误信息,提升体验。

内容的提问来源于stack exchange,提问作者scotth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:15:44