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
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Also du möchtest:
sh -c 'find "$1"' sh /tmp
(In den alten Tagen konnten Sie sh
Implementierungen finden , in die $1
stattdessen das erste Argument einging , also würden Sie Folgendes tun:
sh -c 'find "$1"' /tmp /tmp
Oder:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
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:
my_func() {
find "$1"
}
my_func /tmp
Einige Shells unterstützen anonyme Funktionen. Das ist der Fall von zsh
:
(){find "$1"} /tmp
Oder es
:
@{find $1} /tmp
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:
set arg1 arg2 ... argn
Sie benötigen jedoch:
set --
Um diese Liste (oder shift "$#"
) zu leeren und
set -- -foo
In dem Satz $1
zu etwas ab -
oder +
, es ist so immer eine gute Gewohnheit verwendet set --
vor allem , wenn beliebige Daten wie die Verwendung von set -- "$@" other-arg
Argumenten an das Ende der Positionsparameterliste hinzuzufügen.
In Shells der csh
Familie ( csh
, tcsh
) weisen Sie dem argv
Array Folgendes zu:
set argv=(arg1 arg2)
In Schalen der rc
Familie ( rc
, es
, akanga
), an das *
Array:
*=(arg1 arg2)
Sie können Elemente aber auch einzeln zuweisen:
2=arg2
In fish
sind die Positionsparameter in dem argv
Array nur (keine $1
, $@
dort):
set argv arg1 arg2
Aus zsh
Kompatibilitätsgründen csh
können Sie dem argv
Array auch Folgendes zuweisen :
argv=(arg1 arg2)
argv[4]=arg4
Und Sie können auch tun:
5=arg5
Das heißt, Sie können auch Dinge tun wie:
argv+=(another-arg)
um am Ende ein Argument hinzuzufügen, und:
argv[-1]=()
argv[2]=()
um ein Argument vom Ende oder der Mitte zu entfernen, was mit anderen Shells nicht einfach ist.
(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?