私は小さなbashスクリプトを書いて、sed
いくつかのHTMLページからいくつかのURLを抽出するために使用しました。
sed 結果を変数に取り込み、毎回再読み込みを防ぐために、3つの関数を作成し、一緒にパイプしました。
first_function $1 | second_function | third_function
次のように表現してみましょう。
- 最初の関数は、与えられたリストからアイテムURLを探します。リンクアドレス(
$1
) - 2番目の関数は、各パイプラインURLから画像を抽出します。
src
- 3番目の関数は出力HTMLを組み合わせます。
これでそれをエコーし$lot_url
てHTMLにすべて入れるsecond_function
ことができます。read
third_function
$img_url
もっときれいになるアクセス可能なグローバル変数で作成できる場合 second_function
しかし、third_function
私はできないようです。
これは、関数間で渡される値の数が増えるほど必要になります。
完全なサンプルコードは次のとおりです。
first_function(){
curl -s "$1" | sed -nr '
#extract sub urls
'
}
second_function(){
while read lot_url; do
echo "$lot_url"
curl -s "$lot_url" | sed -nr '
#extract img src
'
done
}
third_function(){
while read lot_url; read img_url; do
echo "<a href="$lot_url"><img src="$img_url" /></a>"
done
}
first_function "$1" | second_function | third_function
ベストアンサー1
パイプの両面は異なるプロセスにあります。これらのプロセス間で変数を共有することはできません。データを共有するには、データをパイプするか、代替通信チャネルを使用する必要があります。代替通信チャネルが必要な場合シェルの機能を超えた場合は、実際のプログラミング言語に切り替えてください。
ここでは、2番目のパイプラインで並列化することが私lot_url
にとってはimg_url
良い解決策のようです。私はそれらを同じ行に渡します。 URLが正しくエスケープされたと仮定すると、特定の引用符は必要なく、2つの引用符を同じ行に渡すことができます。これはimg_url
それぞれに可変数のsを許可するという利点がありますlot_url
。
second_function(){
while read lot_url; do
echo "$lot_url"
curl -s "$lot_url" | sed -nr -e '
#extract img src
' -e "s>^>$lot_url >"
done
}
third_function(){
while read lot_url img_url; do
echo "<a href="$lot_url"><img src="$img_url" /></a>"
done
}