Solarisでのwhile-read-loopの変数範囲

Solarisでのwhile-read-loopの変数範囲

私のwhileループに内部スコープがあるように見える理由を誰か説明できますか?オンラインでいくつかの説明を見ましたが、すべてパイプに関連しています。私のコードはそうではありません。

パスワード:

#!/bin/sh
while read line
do
  echo "File contents: $line"
  echo
  if [ 1=1 ]; then
    test1=bob
  fi
  echo "While scope:"
  echo "  test1: $test1"
done < test.txt

if [ 1=1 ]; then
  test2=test2;
fi

echo;
echo "Script scope: "
echo "  test1: $test1"
echo "  test2: $test2"

出力:

File contents: In the file

While scope:
  test1: bob

Script scope:
  test1: 
  test2: test2

ベストアンサー1

Bourneシェルで複合コマンド(loopなどwhile)をリダイレクトすると、サブシェルで複合コマンドが実行されます。

Solaris 10 以前の1/bin/shでは Bourne シェルなので、使用したくありません。 POSIXを取得するには、/usr/xpg4/bin/shまたはを使用してください。/usr/bin/kshsh

何らかの理由でを使用する必要がある場合は、次の手順を/bin/sh実行するのではなく、この問題を解決してください。

compound-command < file

あなたはできます:

exec 3<&0 < file
compound-command
exec <&3 3<&-

それは:

  1. fd 0をfd 3にコピーして保存し、fd 0をそのファイルにリダイレクトします。
  2. コマンドの実行
  3. fd 3に保存されているコピーからfd 0を復元します。不要になったfd 3を閉じます。

1. Solaris 11 以降では、Oracle は最終的に (最終的に) /bin/shPOSIX シェルを作成したので、他のほとんどの Unices のように動作します。 (他のUniceと同様に)これに基づいているため、拡張はサポートされていますがPOSIX指定言語をsh解釈します。現在、通常はksh88、pdksh、bash、yash、またはEnhanced Ashに基づいています))shksh88sh

おすすめ記事