是否可以将不同的内容回显到在bash范围内为循环创建的不同文件



我正在尝试创建一个名为create.ip.list.txt.sh的脚本

当运行时,我希望输出如下:

[root@ubuntu]$ head li*
==> list1.txt <==
192.168.1.100
192.168.1.101
192.168.1.102
192.168.1.103
192.168.1.104
==> list2.txt <==
192.168.1.105
192.168.1.106
192.168.1.107
192.168.1.108
192.168.1.109
==> list3.txt <==
192.168.1.110
192.168.1.111
192.168.1.112
192.168.1.113
192.168.1.114

这是我目前为止的脚本:

#!/bin/bash
i=1
for i in list{1..3}.txt; do
echo -e -n "b192.168.1.10"{0..4}"n" > $i
echo -e -n "b192.168.1.10"{5..9}"n" > $i
echo -e -n "b192.168.1.1"{10..14}"n" > $i
done;

但当我运行代码时,我得到的输出是:

[root@ubuntu]$ head li*
==> list1.txt <==
192.168.1.110
192.168.1.111
192.168.1.112
192.168.1.113
192.168.1.114
==> list2.txt <==
192.168.1.110
192.168.1.111
192.168.1.112
192.168.1.113
192.168.1.114
==> list3.txt <==
192.168.1.110
192.168.1.111
192.168.1.112
192.168.1.113
192.168.1.114
[root@ubuntu]$

它循环并根据需要创建单独的文件,但似乎是在向所有文件回显最后一个echo命令。有人知道我做错了什么吗?或者你可以给我指明正确的方向吗?提前谢谢。

如果已经有人问过这个问题,我很抱歉,但我已经试着四处寻找解决方案,但没有出现任何类似我的场景。通常,posts让range循环写入一个文件,这里我希望从range循环创建多个文件。也许我在搜索时没有使用正确的术语,但如果有任何帮助,我们将不胜感激。如果这个问题已经被问过,请不要惩罚我。如果有,请告诉我,如果需要,我可以删除帖子或重新定位。

真诚,

一个谦虚的学生

  1. 它将向所有文件写入相同的内容,因为您不会根据所使用的文件更改循环中的内容。它在每一行独立且完全地展开大括号展开;单独创建这三个文件的唯一原因是第一个这样的扩展是CCD_ 2。。。in循环初始化子句。一旦你看到你的代码在卷曲扩展后的样子,它可能会更有意义:

    for i in list1.txt list2.txt list3.txt; do
    echo -e -n "b192.168.1.10"0"n" "b192.168.1.10"2"n" "b192.168.1.10"3"n" "b192.168.1.10"4"n" > $i
    echo -e -n "b192.168.1.10"5"n" "b192.168.1.10"6"n" "b192.168.1.10"7"n" "b192.168.1.10"8"n" "b192.168.1.10"9"n" > $i
    echo -e -n "b192.168.1.1"10"n" "b192.168.1.1"11"n" "b192.168.1.1"12"n" "b192.168.1.11"13"n" "b192.168.1.1"14"n" > $i
    done
    
  2. 您只能看到最后一个内容,因为您使用的是>,它会覆盖整个文件。如果要分别重定向每一行,则需要使用>>,它会附加在文件的末尾,而不会擦除已经存在的内容。

但更简单的做法是,只使用几个嵌套的计数循环和一些数学运算,并将整个内部循环重定向到文件,作为一个仍然可以使用>:的单一重定向

for i in {0..2}; do  # or for (( i=0; i<3; ++i )); do
for j in {0..4}; do  # or for (( j=0; j<5; ++j )); do
let b=100+i*5+j
printf 'b192.168.1.%dn' "$b"
done >list$((i+1)).txt
done

我使用了printf而不是echo -e -n,因为printf比bash更简单,而且可以移植到更多的shell。不过,我不知道你为什么要在IP地址文本文件的每一行开头写一个退格;如果你放弃了,你可以只使用echo 192.168.1.$b

针对您关于超过255的评论:如果您想对IP地址执行算术运算,我会考虑使用shell及其内置算术功能之外的其他功能。在友好的邻居包管理器中可能有许多专用的IP操作工具,但您可以使用可能已经安装的工具,如Ruby:

ip=192.168.1.250
for i in {0..2}; do
f=list$((i+1)).txt
for j in {0..4}; do
printf 'b%sn' "$ip"
ip=$(ruby -ripaddr -lpe '$_=IPAddr.new(IPAddr.new($_).to_i+1,2)' <<<$ip)
done >"$f"
done

之后list2.txt看起来像这样:

192.168.1.255
192.168.2.0
192.168.2.1
192.168.2.2
192.168.2.3

如果使用printf,则不需要任何循环。

此外,如果要根据一定数量的行拆分内容,请使用split命令。

printf "192.168.10.1%02dn" {0..14} | 
split --lines=5 --suffix-length=1 --additional-suffix=.txt 
--numeric-suffixes=1 - list

最新更新