Manchmal ist es notwendig, die obigen Variablen in kleinen Beispielen zu emulieren und zu überprüfen und kann dann sofort in ein Skript usw. kopiert werden.
Ich habe versucht, anhand eines einfachen Beispiels Folgendes zu lösen:
(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh
und mit anderen Kombinationen. Experimentierte auch durch Hinzufügen der Shebang-Interpreter-Direktive #!/bin/sh -x
, erzielte jedoch nicht das gewünschte Ergebnis.
Kann ich das einfach machen?
(find $1) /tmp
ist ein Syntaxfehler. Eigentlich(any-command) more-arguments
ist ein Syntaxfehler. Können Sie anders erklären, was Sie versuchen zu tun?rc
Familie (rc
,es
,akanga
...), wobei in diesem Fall, die äquivalent istfind $1 /tmp
.Antworten:
Das erste Argument danach
sh -c inline-script
geht an$0
(das auch für Fehlermeldungen verwendet wird), und der Rest geht hinein$1
,$2
...Also du möchtest:
(In den alten Tagen konnten Sie
sh
Implementierungen finden , in die$1
stattdessen das erste Argument einging , also würden Sie Folgendes tun:Oder:
um beide Verhaltensweisen zu berücksichtigen, aber diese Shells sind jetzt verschwunden, da POSIX weit verbreitet und öffentlich verfügbar ist.
Wenn Sie festlegen mögen
$1
,$2
in einem lokalen Bereich innerhalb des aktuell Shell, das ist , wo Sie Funktionen verwenden würden. In Bourne-ähnlichen Muscheln:Einige Shells unterstützen anonyme Funktionen. Das ist der Fall von
zsh
:Oder
es
:Um die aktuellen Positionsparameter dauerhaft zu ändern, ist die Syntax von der Shell abhängig. dchirikov hat bereits die Bourne-wie Muscheln bedeckt (Bourne, Korn,
bash
,zsh
, POSIX,ash
,yash
...).Die Syntax lautet:
Sie benötigen jedoch:
Um diese Liste (oder
shift "$#"
) zu leeren undIn dem Satz
$1
zu etwas ab-
oder+
, es ist so immer eine gute Gewohnheit verwendetset --
vor allem , wenn beliebige Daten wie die Verwendung vonset -- "$@" other-arg
Argumenten an das Ende der Positionsparameterliste hinzuzufügen.In Shells der
csh
Familie (csh
,tcsh
) weisen Sie demargv
Array Folgendes zu:In Schalen der
rc
Familie (rc
,es
,akanga
), an das*
Array:Sie können Elemente aber auch einzeln zuweisen:
In
fish
sind die Positionsparameter in demargv
Array nur (keine$1
,$@
dort):Aus
zsh
Kompatibilitätsgründencsh
können Sie demargv
Array auch Folgendes zuweisen :Und Sie können auch tun:
Das heißt, Sie können auch Dinge tun wie:
um am Ende ein Argument hinzuzufügen, und:
um ein Argument vom Ende oder der Mitte zu entfernen, was mit anderen Shells nicht einfach ist.
quelle
ist was du brauchst:
quelle