2017-05-05 11 views
0

私はforループを使用して数字のリストを生成しています(1つ増えています)。forループを繰り返してカスタマイズした文字列を作成する方法

echoteeを組み合わせて使用​​しています。

私は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コマンドは完全なファイルを調べ、1つの改行をカンマで置き換えます。ループの外側に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

ああ、二重引用符!私の答えを更新させてください。 –

関連する問題