Ersetze einfach den speziell interpretierten /dev/stdin
von bash als Dateinamen:
(Beachten Sie, dass bash diese spezielle Datei /dev/stdin
verwendet, wenn sie für ein Betriebssystem erstellt wird das bietet es , aber da bash 2.04 die Abwesenheit dieser Datei auf Systemen, die es nicht unterstützen, umgehen kann.
Variablen wird ein Wert von Var=Value
zugewiesen und diese Variable wird z. %Code%. In Ihrem Fall wäre das
beim Zuweisen der Standardeingabe. Ich glaube jedoch nicht, dass Variablennamen mit einem Ziffernzeichen beginnen dürfen. Siehe die Frage bash read from file oder stdin , um das Problem zu lösen.
Hier ist meine Version des Skripts:
%Vor%Wenn die Datei im Argument nicht vorhanden ist, lesen Sie die Standardeingabe von .
Weitere Beispiele: Wie liest man aus Datei oder Standard in bash? bei stackoverflow SE
pilcrows Antwort bietet eine elegante Lösung ; Dies ist eine Erklärung dafür, warum der Ansatz des OP nicht funktioniert hat.
Das Hauptproblem des OP-Ansatzes war der Versuch, > Positionsparameter mit
=...
zuzuweisen, was ' t arbeiten.
Die LHS wird durch die Shell um den Wert von erweitert, und das Ergebnis wird als Name der Variablen interpretiert, die zugewiesen werden soll - eindeutig nicht die Absicht.
Die einzige Möglichkeit, in bash zuzuweisen, ist über die
set
builtin .
Der Vorbehalt ist, dass set
immer all Positionsparameter festlegt, also müssen Sie auch die anderen einschließen, falls vorhanden.
(Wenn Sie höchstens ein 1 Argument erwarten, wird set -- "${1:-/dev/stdin}"
ausreichen.)
Das obige korrigiert auch ein sekundäres Problem mit dem Ansatz des OP: der Versuch, den Inhalt und nicht den Dateinamen von stdin in zu speichern, seit
<
wird verwendet.
${1:-/dev/stdin}
ist eine Anwendung der bash Parametererweiterung , die besagt: gib den Wert von zurück, außer
ist nicht definiert (kein Argument wurde übergeben) oder sein Wert ist die leere Zeichenfolge (
""
oder ''
wurde übergeben). Die Variation ${1-/dev/stdin}
(no :
) würde nur /dev/stdin
zurückgeben, wenn undefined ist (wenn sie irgendeinen Wert enthält, auch die leere Zeichenfolge, it würde zurückgegeben werden.
Wenn wir alles zusammensetzen:
%Vor% Aber natürlich wäre der viel einfachere Ansatz, ${1:-/dev/stdin}
direkt als Dateinamen zu verwenden:
oder über eine Zwischenvariable:
%Vor%