如何在grep中结合变量与额外命令?循环内IP作为grep参数失效
解决for循环中IP地址作为grep参数的执行问题
原场景代码(读取IP列表的for循环):
for i in $(eval echo "{1..$ip_count}") do echo $ip |sed -n ${i}p done
尝试在循环内执行的命令(无法正常运行):
avahi-browse -rvpc | grep $($ip |sed -n ${i}p)
问题原因
你写的$($ip |sed -n ${i}p)是错误语法:$()是命令替换,它会把$ip的内容当作命令去执行,而非把$ip作为输入传给sed,这会直接导致执行报错,自然无法完成grep匹配。
修复方法
方法1:修正原循环内的变量读取逻辑
先把当前循环的IP地址读取到变量里,再传给grep:
for i in $(eval echo "{1..$ip_count}") do # 获取当前行的IP,加引号避免空格/特殊字符解析问题 current_ip=$(echo "$ip" | sed -n "${i}p") # 用双引号包裹变量,防止IP含特殊字符时出错 avahi-browse -rvpc | grep "$current_ip" done
方法2:改用更高效可靠的while循环(推荐)
避免使用eval(存在安全风险且可读性差),直接逐行读取IP列表:
# 若$ip是多行IP字符串,用here-string传给while循环 while read -r current_ip do # 跳过空行 [ -z "$current_ip" ] && continue avahi-browse -rvpc | grep "$current_ip" done <<< "$ip" # 如果IP存储在文件中,直接读取文件更方便: # while read -r current_ip # do # [ -z "$current_ip" ] && continue # avahi-browse -rvpc | grep "$current_ip" # done < ip_list.txt
额外优化提示
- 给变量和命令参数加双引号
"",可避免IP含特殊字符(如带端口的IP)或空格时出现解析错误。 - 若
avahi-browse输出量很大,建议先把结果保存到临时文件,再循环匹配,减少重复执行avahi-browse的开销:
# 先保存avahi输出到临时文件 avahi-browse -rvpc > /tmp/avahi_output.txt # 循环IP去匹配 while read -r current_ip do [ -z "$current_ip" ] && continue grep "$current_ip" /tmp/avahi_output.txt done <<< "$ip" # 最后删除临时文件 rm /tmp/avahi_output.txt
内容的提问来源于stack exchange,提问作者WingZero
相关产品推荐
相关产品推荐

