Le premier argument après sh -c inline-scriptva à $0(qui est également utilisé pour les messages d'erreur), et le reste entre $1, $2...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Alors tu veux:
sh -c 'find "$1"' sh /tmp
(dans les temps anciens, vous pouviez trouver des shimplémentations où le premier argument est entré à la $1place, vous feriez donc:
sh -c 'find "$1"' /tmp /tmp
Ou:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
pour tenir compte des deux comportements, mais ces coquilles ont disparu maintenant que POSIX est répandu et accessible au public).
Si vous souhaitez définir $1, $2dans une portée locale dans le shell actuel, c'est là que vous utiliserez les fonctions. En coquilles de type Bourne:
my_func() {
find "$1"
}
my_func /tmp
Certains shells prennent en charge les fonctions anonymes. C'est le cas de zsh:
(){find "$1"} /tmp
Ou es:
@{find $1} /tmp
Pour modifier définitivement les paramètres de position actuels, la syntaxe dépend du shell. dchirikov a déjà couvert la Bourne comme des coquilles (Bourne, Korn, bash, zsh, Posix ash, yash...).
La syntaxe est:
set arg1 arg2 ... argn
Cependant, vous avez besoin de:
set --
Pour vider cette liste (ou shift "$#") et
set -- -foo
pour définir $1quelque chose commençant par -ou +, c'est donc une bonne habitude de toujours l'utiliser, en set --particulier lorsque vous utilisez des données arbitraires, comme set -- "$@" other-argpour ajouter des arguments à la fin de la liste des paramètres positionnels.
Dans les shells de la cshfamille ( csh, tcsh), vous affectez au argvtableau:
set argv=(arg1 arg2)
Dans les coquilles de la rcfamille ( rc, es, akanga), au *tableau:
*=(arg1 arg2)
Bien que vous puissiez également affecter des éléments individuellement:
2=arg2
Dans fish, les paramètres positionnels sont dans le argvtableau uniquement (non $1, $@là):
set argv arg1 arg2
Dans zsh, pour des raisons de compatibilité avec csh, vous pouvez également affecter au argvtableau:
argv=(arg1 arg2)
argv[4]=arg4
Et vous pouvez aussi faire:
5=arg5
Cela signifie que vous pouvez également faire des choses comme:
argv+=(another-arg)
pour ajouter un argument à la fin, et:
argv[-1]=()
argv[2]=()
pour supprimer un argument de la fin ou du milieu, ce que vous ne pouvez pas faire facilement avec d'autres shells.
(find $1) /tmpest une erreur de syntaxe.(any-command) more-argumentsEst en fait une erreur de syntaxe. Pouvez-vous expliquer différemment ce que vous essayez de faire?