如何迭代for循环并创建自定义字符串

问题描述:

我有一个bash脚本,我使用for循环来生成数字列表(增加1)。如何迭代for循环并创建自定义字符串

在我的循环中,我使用echo结合tee来构建出我的字符串。

然后,我使用sed采取我的“列表”(输入为文件)的数字,然后格式化它。

因为我使用for循环来生成这个列表(文本文件),有没有一种更好,更有效的方式来创建我的字符串(它被附加为循环)以包含双引号的值而不必先写入文件?

这里是我的代码:

#!/usr/local/bin/bash 

if [[ $# != 3 ]]; then 
    echo "Usage: ./crIPRange.sh <octet> <start#> <ending#>" 2>&1 
    echo "Example: ./crIPRange.sh 10.1.2 100 150" 2>&1 
    exit 1 
fi 

_octet="$1" 
_startIP="$2" 
_IPList="List1.out" 
_IPListFinal="List2.out" 

for ((c=$2; c<=$3; c++)) 
do 
    echo "${_octet}.$c" | tee >> ${_IPList} 
    sed -E 's/^(.*)$/"\1"/' ${_IPList} | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/,/g' | tee > ${_IPListFinal} 
done 

换句话说,我想我不一定需要它写入到文件列表的那一步?

所以最后,我有(2)输出文件,我真的只需要我的最终输出。我会使用类似printf的东西吗?

这看起来像一个残酷复杂的方式来做一个逗号分隔列表。对于每个单独的条目,您的sed命令会遍历整个文件,只是用逗号替换单个换行符。将sed移动到循环外部并仅执行一次就可以提高效率。

但是你根本不需要sed(也没有中间文件)。该解决方案中填入我们想要的元素的数组,然后打印它作为一个单一字符串IFS设置为一个逗号:

#!/bin/bash 

(($# != 3)) && echo "Wrong number of arguments" >&2 

subnet=$1 
from=$2 
to=$3 

for ((i = from; i <= to; ++i)); do 
    arr+=("\"$subnet.$i\"") 
done 

IFS=, 

echo "${arr[*]}" 

请注意,您比较if [[ $# != 3 ]]使用意味着字符串!=,但应该使用-ne换号。或者甚至更容易,(())就是这个意思。

用法和输出:

$ ./octet 1.2.3 10 15 
"1.2.3.10","1.2.3.11","1.2.3.12","1.2.3.13","1.2.3.14","1.2.3.15" 

或者,如果你不想要的功能,你可以使用大括号展开和tr

$ echo \"1.2.3.{10..15}\" | tr ' ' , 
"1.2.3.10","1.2.3.11","1.2.3.12","1.2.3.13","1.2.3.14","1.2.3.15" 

这是不可能的参数,虽然。

+0

这是一个黑客,因为它一直是我正在学习脚本。欣赏输入。感谢您指出不良做法并提供替代解决方案。 – noober

+0

如何双引号输出?:''1.2.3.10“,”1.2.3.11“,”1.2.3.12“' – noober

+0

哦,双引号!让我更新我的答案。 –