2016-05-20 1 views
0

私がしたいこと:リダイレクトされていないすべての製品(URL)を探したい。Bash:最初のURLのみを出力するカールを使用してURLをループする

次のように私はcurlコマンドを使用しているリダイレクト後の最終的なURLを取得するには:

curl -Ls -o /dev/null -w %{url_effective} "$URL"

これが正常に動作しています。今私は、リダイレクトされていないURLを取得し、それらをプログラムの出力として表示するために、URLを繰り返し処理したいと考えています。私は次のコードを持っています:

result="" 
productIds=$1 
for productId in $(echo $productIds | sed "s/,/ /g") 
do 
    echo "Checking product: $productId"; 
    URL="http://localhost/?go=$productId"; 
    updatedURL=`curl -Ls -o /dev/null -w %{url_effective} "$URL"` 

    echo "URL : $URL, UpdatedUrl: $updatedURL"; 
    if [ "$URL" == "$updatedURL" ] 
    then 
      result="$result$productId,"; 
    fi 
done 

curlコマンドは最初の製品でのみ動作します。しかし、2番目から最後の製品までは、URLupdatedURLはすべて同じです。私は理由を理解できないのですか? productIdは繰り返しごとに変化しているので、キャッシュに関連するものではないと私は思う。

また、私はまたcurl次のバリエーションを試してみた:

updatedURL=$(curl -Ls -o /dev/null -w %{url_effective} "$URL")

updatedURL="$(curl -Ls -o /dev/null -w %{url_effective} "$URL")"


編集:デバッグモードと異なる方法の多くとしようとした後。私は手動でターミナルで次のようにヒットした場合、私は、パターン、すなわち気づい:

curl -Ls -o /dev/null -w %{url_effective} "http://localhost/?go=32123"

そして、シェルスクリプトでこれらのURLが正常に動作します。しかし、私が手動でヒットしなければ、curlもシェルスクリプトを介してそれらの製品では動作しません。

+0

どのように必要な場合は私に知らせてchanges.Doコードが必要ですつまり、 '$ 1' /' $ productIds'とは何ですか? –

+0

'sh test.sh 123,456,789,221'は私がシェルスクリプトを呼び出すのに使っているものです。 '$ 1'は私がスクリプトの中でユーザー入力を得るために使っているものです。 –

+1

'#!/ bin/bash -vx'を一番上の行に置き、test.shを実行可能にしてからtestを呼び出します。shを使わないsh - たくさんのデバッグ出力を与えて、URLの割り当てが動作するかどうかを確認してください。 –

答えて

0

私はこのような何かにあなたのループを変更することをお勧め:

IFS=, read -ra productIds <<<"$1" 
for productId in "${productIds[@]}"; do 
    url=http://localhost/?go=$productId 
    num_redirects=$(curl -Ls -o /dev/null -w %{num_redirects} "$url") 
    if [ "$num_redirects" -eq 0 ]; then 
     printf 'productId %s has no redirects\n' "$productId" 
    fi 
done 

これは、区切り文字としてカンマを使用して、配列にスクリプトに渡された最初の引数を分割します。リダイレクトの数は変数に格納されます。番号がゼロの場合、メッセージが印刷されます。

私は本来の方法で本質的に壊れたものは見えないことを認めなければなりません。私たちが気付いていない余分なことが起こっている可能性があります。再現可能なテストケースを提供できれば、より効果的にお手伝いすることができます。

+0

このループは役に立ちません。同じ問題。それは前のものと同じことをしています。また、読み込み行の 'product_ids'を' productIds'に変更したいかもしれません。 –

+1

変数名についての良い点は、私はテストの後で両方を変更するのを忘れていました(私は通常、シェルスクリプトでアンダースコアを使用します)。私はまだ外部ツールを使用してあなたを保存するこのアプローチをお勧めします。残念ながら、あなたの変数が何であるかを知らなくても、私は本当にデバッグできません。 'set -x'を使うことをお勧めします。 –

1

#!/bin/bashをシェルの最初の行に追加するだけです。それは必要な出力を生成します。今の呼び出しは、Bourne経由 shell and its output

123456789221こののbash file.shなどの呼び出しでなければなりません123456789221のsh file.shシェルんが、それも:)

関連する問題