2017-05-05 84 views
0

我有一個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的東西嗎?

回答

1

這看起來像一個殘酷複雜的方式來做一個逗號分隔列表。對於每個單獨的條目,您的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

哦,雙引號!讓我更新我的答案。 –