求助:如何将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
相关产品推荐
相关产品推荐

