Bash脚本需求:随机写入2项到文件及从列表选取2个随机DNS服务器并排查现有脚本报错
Bash脚本需求:随机写入2项到文件及从列表选取2个随机DNS服务器并排查现有脚本报错
我来帮你梳理下现有脚本里的问题,这些错误就是导致你运行失败的原因:
- 变量类型错误:你把
NAMESERVERS定义成了字符串,而不是Bash数组。${#NAMESERVERS[@]}这种语法是用来获取数组元素个数的,对字符串使用的话,得到的是字符串的字符长度,不是你想要的服务器数量,这就是SIZE计算错误的根源。 - 变量名拼写错误:脚本里多处变量名写错了,比如
NS_IDX1根本没定义过(你只定义了NS_IDX),还有后面的NX_IDX1、NX_IDX2明显是手滑打错成了NS_IDX1、NS_IDX2;另外IDX_RANGE这个变量也没定义,应该用之前的SIZE。 - 循环逻辑初始化错误:你把
NS_IDX2初始化为${NS_IDX1},但此时NS_IDX1不存在,这会直接导致报错。
接下来是修正后的完整脚本,关键部分我都做了标注:
# 用数组定义DNS服务器列表,每个地址用双引号包裹,空格分隔 NAMESERVERS=("x.x.x.x" "x.x.x.x" "x.x.x.x" "x.x.x.x") # 获取数组的元素个数,这才是正确的服务器数量 SIZE=${#NAMESERVERS[@]} # 生成第一个随机索引,范围是0到SIZE-1(Bash数组从0开始计数) NS_IDX1=$(($RANDOM % ${SIZE})) # 初始化第二个索引为第一个索引的值,确保进入循环 NS_IDX2=${NS_IDX1} # 循环直到两个索引不同,保证选到两个不同的服务器 while [ "${NS_IDX1}" == "${NS_IDX2}" ] do NS_IDX2=$(($RANDOM % ${SIZE})) done # 根据索引取出对应的服务器IP NS_IP1=${NAMESERVERS[${NS_IDX1}]} NS_IP2=${NAMESERVERS[${NS_IDX2}]} # 写入到resolv.conf,注意标准格式要加nameserver前缀,系统文件可能需要sudo权限 echo -e "nameserver ${NS_IP1}\nnameserver ${NS_IP2}" > /etc/resolv.conf
再给你补充几个细节:
- 数组是Bash处理多元素集合的标准方式,能准确获取元素数量和按索引取值。
$RANDOM会生成0到32767之间的随机数,用% ${SIZE}取余后,就能得到数组的有效索引范围。- 如果你的系统里
/etc/resolv.conf是受保护的系统文件,执行写入操作前需要加sudo,比如sudo echo ... > /etc/resolv.conf(或者用sudo tee避免权限问题)。
备注:内容来源于stack exchange,提问作者kathyl
相关产品推荐
相关产品推荐

