我正在尝试创建一个名为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循环创建多个文件。也许我在搜索时没有使用正确的术语,但如果有任何帮助,我们将不胜感激。如果这个问题已经被问过,请不要惩罚我。如果有,请告诉我,如果需要,我可以删除帖子或重新定位。
真诚,
一个谦虚的学生
-
它将向所有文件写入相同的内容,因为您不会根据所使用的文件更改循环中的内容。它在每一行独立且完全地展开大括号展开;单独创建这三个文件的唯一原因是第一个这样的扩展是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
-
您只能看到最后一个内容,因为您使用的是
>
,它会覆盖整个文件。如果要分别重定向每一行,则需要使用>>
,它会附加在文件的末尾,而不会擦除已经存在的内容。
但更简单的做法是,只使用几个嵌套的计数循环和一些数学运算,并将整个内部循环重定向到文件,作为一个仍然可以使用>
:的单一重定向
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