Pierwszy argument po sh -c inline-script
idzie $0
(który jest również stosowany do komunikatów o błędach), a reszta iść $1
, $2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Więc chcesz:
sh -c 'find "$1"' sh /tmp
(w dawnych czasach można było znaleźć sh
implementacje, w które wszedł pierwszy argument $1
, więc zrobiłbyś:
sh -c 'find "$1"' /tmp /tmp
Lub:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
aby uwzględnić oba zachowania, ale te powłoki zniknęły teraz, gdy POSIX jest powszechny i publicznie dostępny).
Jeśli chcesz ustawić $1
, $2
w zakresie lokalnym w bieżącej powłoce, to właśnie tam możesz użyć funkcji. W muszlach podobnych do Bourne'a:
my_func() {
find "$1"
}
my_func /tmp
Niektóre powłoki obsługują anonimowe funkcje. Tak jest w przypadku zsh
:
(){find "$1"} /tmp
Lub es
:
@{find $1} /tmp
Aby trwale zmienić bieżące parametry pozycyjne, składnia zależy od powłoki. dchirikov już pokryte Bourne-jak muszli (Bourne, Korn bash
, zsh
POSIX, ash
, yash
...).
Składnia jest następująca:
set arg1 arg2 ... argn
Potrzebujesz jednak:
set --
Aby opróżnić tę listę (lub shift "$#"
) i
set -- -foo
ustawić $1
na coś zaczynającego się od -
lub +
, więc dobrym nawykiem jest zawsze używać, set --
szczególnie gdy używa się dowolnych danych, takich jak set -- "$@" other-arg
dodawanie argumentów na końcu listy parametrów pozycyjnych.
W powłokach csh
rodziny ( csh
, tcsh
) przypisujesz do argv
tablicy:
set argv=(arg1 arg2)
W powłokach z rc
rodziny ( rc
, es
, akanga
), do *
tablicy:
*=(arg1 arg2)
Możesz jednak przypisywać elementy indywidualnie:
2=arg2
W fish
pozycyjne parametry są w argv
tablicy wyłącznie (bez $1
, $@
nie)
set argv arg1 arg2
W zsh
celu zapewnienia zgodności z csh
można również przypisać do argv
tablicy:
argv=(arg1 arg2)
argv[4]=arg4
Możesz także:
5=arg5
Oznacza to, że możesz także wykonywać następujące czynności:
argv+=(another-arg)
dodać argument na końcu i:
argv[-1]=()
argv[2]=()
aby usunąć argument z końca lub środka, czego nie można łatwo zrobić z innymi powłokami.
(find $1) /tmp
jest błędem składni. W rzeczywistości(any-command) more-arguments
jest to błąd składniowy. Czy potrafisz inaczej wytłumaczyć, co próbujesz zrobić?