如何在bash脚本ezkill中复用类打印机页面设置的PID输入解析功能?
完美解决你的需求:复用现成工具/函数实现PID范围输入
这种类似打印机页面的范围输入格式真的太实用了,完全没必要自己从头造轮子!下面给你几个现成的解决方案,直接拿来用就行:
方案1:直接复用bash函数(零依赖,纯bash实现)
这个函数专门处理数字范围的展开,支持单个PID、连续范围(比如123-127)、枚举(比如123,125)以及混合模式,完全符合你的需求:
expand_pid_range() { local input="$1" # 将逗号分隔的部分拆分成每行处理 echo "$input" | tr ',' '\n' | while read -r segment; do # 判断当前段是范围还是单个PID if [[ "$segment" == *-* ]]; then # 拆分范围的起始和结束值 local start=${segment%-*} local end=${segment#*-} # 验证是否为有效数字 if [[ ! "$start" =~ ^[0-9]+$ || ! "$end" =~ ^[0-9]+$ ]]; then echo "错误:无效的范围格式 '$segment'" >&2 return 1 fi # 生成连续PID序列 seq "$start" "$end" else # 验证单个PID是否为有效数字 if [[ ! "$segment" =~ ^[0-9]+$ ]]; then echo "错误:无效的PID '$segment'" >&2 return 1 fi echo "$segment" fi done }
怎么用在你的ezkill脚本里?
只需要把这个函数加到脚本里,然后调用它处理用户输入的PID参数:
# 假设用户输入的PID范围是第一个参数 pid_input="$1" # 展开所有PID expanded_pids=$(expand_pid_range "$pid_input") # 遍历执行kill操作(可以加额外验证,比如检查PID是否存在) for pid in $expanded_pids; do if ps -p "$pid" > /dev/null 2>&1; then echo "正在终止PID $pid..." kill "$pid" else echo "警告:PID $pid 不存在,跳过" >&2 fi done
方案2:用现成的命令行工具(更简洁)
如果你的系统允许安装额外工具,numrange是个绝佳选择——它就是专门用来处理这种数字范围展开的工具,支持你需要的所有格式:
安装方法(以Debian/Ubuntu为例)
sudo apt install numrange
使用示例
直接传入你的范围字符串,它会输出所有展开后的数字:
numrange "123-127,130,135-138" # 输出:123 124 125 126 127 130 135 136 137 138
把它整合到你的ezkill脚本里也很简单:
pid_input="$1" expanded_pids=$(numrange "$pid_input") # 后续的kill逻辑和上面一样 for pid in $expanded_pids; do # ... 执行kill操作 done
小提示
不管用哪种方案,都建议在kill前加一步PID存在性检查,避免误操作或者报错。另外,如果需要支持强制终止(比如kill -9),可以把kill命令改成kill -9 "$pid"即可。
内容的提问来源于stack exchange,提问作者kraymer
相关产品推荐
相关产品推荐

