O primeiro argumento após sh -c inline-script vai para $0 (que também é usado para mensagens de erro), e o restante entra em $1 , $2 ...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Então você quer:
sh -c 'find "$1"' sh /tmp
(antigamente, você poderia encontrar sh implementações em que o primeiro argumento entrou em $1 , então você faria:
sh -c 'find "$1"' /tmp /tmp
Ou:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
para explicar os dois comportamentos, mas esses shells desapareceram agora que o POSIX é predominante e está disponível publicamente).
Se você quiser definir $1 , $2 em um escopo local dentro do shell atual, é onde você usaria funções. Em conchas semelhantes a Bourne:
my_func() {
find "$1"
}
my_func /tmp
Alguns shells suportam funções anônimas. Esse é o caso de zsh :
(){find "$1"} /tmp
Ou es :
@{find $1} /tmp
Para alterar os parâmetros posicionais atuais, permanentemente, a sintaxe é dependente do shell. dchirikov já cobriu os reservatórios Bourne-like (Bourne, Korn, bash , zsh , POSIX, ash , yash ...).
A sintaxe é:
set arg1 arg2 ... argn
No entanto, você precisa:
set --
Para esvaziar essa lista (ou shift "$#" ) e
set -- -foo
para definir $1 para algo que começa com - ou + , por isso é um bom hábito usar sempre set -- , especialmente ao usar dados arbitrários, como set -- "$@" other-arg , para adicionar argumentos ao final do posicionamento lista de parâmetros.
Em shells da família csh ( csh , tcsh ), você atribui à matriz argv :
set argv=(arg1 arg2)
Em shells da família rc ( rc , es , akanga ), para a matriz * :
*=(arg1 arg2)
Embora você também possa atribuir elementos individualmente:
2=arg2
Em fish , os parâmetros posicionais estão no argv array somente (sem $1 , $@ there):
set argv arg1 arg2
Em zsh , para compatibilidade com csh , você também pode atribuir à matriz argv :
argv=(arg1 arg2)
argv[4]=arg4
E você também pode fazer:
5=arg5
Isso significa que você também pode fazer coisas como:
argv+=(another-arg)
para adicionar um argumento ao final e:
argv[-1]=()
argv[2]=()
para remover um argumento do final ou do meio, o que você não pode fazer facilmente com outros shells.