我有一个 bash 脚本,我在其中使用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"
但是,这不能被参数化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句