如何迭代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"
这是不可能的参数,虽然。
这是一个黑客,因为它一直是我正在学习脚本。欣赏输入。感谢您指出不良做法并提供替代解决方案。 – noober
如何双引号输出?:''1.2.3.10“,”1.2.3.11“,”1.2.3.12“' – noober
哦,双引号!让我更新我的答案。 –