Czasami konieczna jest emulacja i weryfikacja powyższych zmiennych w małych przykładach, a następnie można je natychmiast skopiować do jakiegoś skryptu itp.
Próbowałem rozwiązać, używając prostego przykładu na następujące sposoby:
(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh
i z innymi kombinacjami. Eksperymentowałem również, dodając dyrektywę interpretera shebang #!/bin/sh -x
, ale nie uzyskałem pożądanego rezultatu.
Czy mogę to zrobić po prostu?
(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ć?rc
rodziną (rc
,es
,akanga
...), przy czym w tym przypadku, który jest odpowiednikiemfind $1 /tmp
.Odpowiedzi:
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
...Więc chcesz:
(w dawnych czasach można było znaleźć
sh
implementacje, w które wszedł pierwszy argument$1
, więc zrobiłbyś:Lub:
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:Niektóre powłoki obsługują anonimowe funkcje. Tak jest w przypadku
zsh
:Lub
es
: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:
Potrzebujesz jednak:
Aby opróżnić tę listę (lub
shift "$#"
) iustawić
$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 jakset -- "$@" other-arg
dodawanie argumentów na końcu listy parametrów pozycyjnych.W powłokach
csh
rodziny (csh
,tcsh
) przypisujesz doargv
tablicy:W powłokach z
rc
rodziny (rc
,es
,akanga
), do*
tablicy:Możesz jednak przypisywać elementy indywidualnie:
W
fish
pozycyjne parametry są wargv
tablicy wyłącznie (bez$1
,$@
nie)W
zsh
celu zapewnienia zgodności zcsh
można również przypisać doargv
tablicy:Możesz także:
Oznacza to, że możesz także wykonywać następujące czynności:
dodać argument na końcu i:
aby usunąć argument z końca lub środka, czego nie można łatwo zrobić z innymi powłokami.
źródło
jest to czego potrzebujesz:
źródło