scriptsbashスクリプトを書いた際、変数が有効なスコープ範囲内にあるはずと思っていたのに値が消えてしまうトラブルにはまってしまいました。その原因と対処方法をまとめました。Shortenerなど長い文字になりがちなURLを短縮するサービスが広く利用されています。これらの短縮URLはWebブラウザーなどでクリックすると指定された移動先のURLに移動します。短縮URLの文字を見ただけでは移動先のサイトは分かりません。短縮URLの移動先がさらに短縮URLで別の移動先が指定されていることも少なくありません。そこでCygwinで短縮URLの移動先を再帰的に調べ最後の移動先を表示するbashスクリプトを書いたのですが、変数の値が途中で消えてしまいました。curlコマンドをインストールするcurlコマンドが必要です。Setupかapt-cygなどでcurlをあらかじめインストールしてください。失敗したスクリプト動くはずと思って書いたスクリプトです。$1上のスクリプトをファイルに保存しパーミッションを755に設定します。引数に適当な短縮URLを指定して実行すると、curlコマンドを使って応答ヘッダーを調べます。移動先が指定されていればそのURLの応答ヘッダーを調べる処理を繰返し、最後の移動先を表示するはずでした。実際に実行してみると(1)のstatus変数には間違いなくHTTPステータスが代入されている(2)のstatus変数は値がカラになっているという期待を裏切る結果が起きました。下記サイトを参考にしました。@IThttp://www.atmarkit.co.jp/ait/articles/1209/14/news147.html原因はパイプでつないだ先の変数はパイプ先のみ有効とのことです。上のスクリプトの場合、パイプでつないだwhile文の内側にある(1)のstatus変数はdoneの直前まで有効ですが、doneより下にある(2)のstatus変数はパイプの外側にあるので別の値を持つ変数だった、ということでした。解決策パイプでつないだ先の変数の値を/tmpディレクトリーにファイルとして保存することにしました。修正したスクリプト期待通りに動作するように修正したスクリプトがこちらです。/tmpディレクトリーをRAMディスクに置ければちょっとだけ高速化できそうです。BluemixのJavaアプリ開発ではまったところと対処方法C#のAzure用Webジョブ開発ではまったところ以上、参考になれば幸いです。当ブログは公開後に内容を修正することがあります。当ブログの内容により発生した損害につきましては一切の責任を負いかねますのでご了承下さい。ユーザーの訪問の際にクッキーやアクセス解析という方法でユーザーの行動を記録しています。これはユーザー個人を特定できない情報であり、サイトの質向上のために用いられます。プライバシー保護のために当ブログのクッキーの取得を拒否するにはお使いのブラウザのクッキーの送受信を拒否するよう設定してください。当サイトは第三者によって配信される広告を表示します。その際、ユーザーが過去に閲覧したサイトの情報からユーザーの興味のある広告を優先的に表示することがあります。このために、ユーザーのインターネット閲覧履歴情報を利用することがありますが、これらは個人を特定できる情報ではなく、個人情報の漏洩や電話、手紙、メールによるセールスはありません。