私の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/ksh
sh
何らかの理由でを使用する必要がある場合は、次の手順を/bin/sh
実行するのではなく、この問題を解決してください。
compound-command < file
あなたはできます:
exec 3<&0 < file
compound-command
exec <&3 3<&-
それは:
- fd 0をfd 3にコピーして保存し、fd 0をそのファイルにリダイレクトします。
- コマンドの実行
- fd 3に保存されているコピーからfd 0を復元します。不要になったfd 3を閉じます。
1. Solaris 11 以降では、Oracle は最終的に (最終的に) /bin/sh
POSIX シェルを作成したので、他のほとんどの Unices のように動作します。 (他のUniceと同様に)これに基づいているため、拡張はサポートされていますがPOSIX指定言語をsh
解釈します。現在、通常はksh88、pdksh、bash、yash、またはEnhanced Ashに基づいています))sh
ksh88
sh