Variabler Gültigkeitsbereich in While-Read-Schleife unter Solaris

Variabler Gültigkeitsbereich in While-Read-Schleife unter Solaris

Kann mir bitte jemand erklären, warum meine While-Schleife einen internen Gültigkeitsbereich zu haben scheint? Ich habe online mehrere Erklärungen gesehen, aber sie haben alle mit Pipes zu tun. Mein Code hat keine.

Der Code:

#!/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"

Die Ausgabe:

File contents: In the file

While scope:
  test1: bob

Script scope:
  test1: 
  test2: test2

Antwort1

In der Bourne-Shell führt die Umleitung eines zusammengesetzten Befehls (wie Ihrer whileSchleife) dazu, dass dieser zusammengesetzte Befehl in einer Untershell ausgeführt wird.

In Solaris 10 und früheren Versionen 1 sollten Sie nicht verwenden, /bin/shda es sich dabei um die Bourne-Shell handelt. Verwenden Sie stattdessen /usr/xpg4/bin/shoder /usr/bin/ksh, um ein POSIX zu erhalten sh.

Wenn Sie aus irgendeinem Grund verwenden müssen /bin/sh, können Sie das Problem umgehen, indem Sie Folgendes tun:

compound-command < file

Du kannst tun:

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

Das ist:

  1. Duplizieren Sie FD 0 auf FD 3, um es zu speichern, und leiten Sie FD 0 dann in die Datei um.
  2. Führen Sie den Befehl aus
  3. Stellen Sie FD 0 aus der gespeicherten Kopie auf FD 3 wieder her. Und schließen Sie FD 3, da es nicht mehr benötigt wird.

1. In Solaris 11 und höher hat Oracle schließlich (endlich) /bin/sheine POSIX-Shell erstellt, die sich nun wie die shder meisten anderen Unix-Systeme verhält (sie interpretiert die shvon POSIX angegebene Sprache, unterstützt jedoch Erweiterungen, da sie auf ksh88(wie andere Unix-Systeme, die shnun im Allgemeinen auf ksh88, pdksh, bash, yash oder einer erweiterten ash-Version basieren) basiert).

verwandte Informationen