Первый аргумент после sh -c inline-script
идет к $0
(который также используется для сообщений об ошибках), а остальные идут $1
, $2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Итак, вы хотите:
sh -c 'find "$1"' sh /tmp
(в прежние времена вы могли найти sh
реализации, в которые $1
вместо этого входил первый аргумент , так что вы бы сделали:
sh -c 'find "$1"' /tmp /tmp
Или:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
чтобы объяснить оба поведения, но эти оболочки исчезли теперь, когда POSIX является распространенным и общедоступным).
Если вы хотите установить $1
, $2
в локальной области внутри текущей оболочки, вы будете использовать функции. В борновоподобных оболочках:
my_func() {
find "$1"
}
my_func /tmp
Некоторые оболочки поддерживают анонимные функции. Это случай zsh
:
(){find "$1"} /tmp
Или es
:
@{find $1} /tmp
Для постоянного изменения текущих позиционных параметров синтаксис зависит от оболочки. dchirikov уже покрыл Bourne-подобных оболочках (Bourne, Korn, bash
, zsh
, POSIX, ash
, yash
...).
Синтаксис:
set arg1 arg2 ... argn
Однако вам необходимо:
set --
Чтобы очистить этот список (или shift "$#"
) и
set -- -foo
установить $1
что-то, начинающееся с -
или +
, так что это хорошая привычка всегда использовать, set --
особенно когда используются произвольные данные, такие как set -- "$@" other-arg
добавление аргументов в конец списка позиционных параметров.
В оболочках csh
семейства ( csh
, tcsh
) вы присваиваете argv
массиву:
set argv=(arg1 arg2)
В оболочках rc
семьи ( rc
, es
, akanga
), в *
массиве:
*=(arg1 arg2)
Хотя вы также можете назначить элементы индивидуально:
2=arg2
В fish
позиционные параметры в argv
массиве только (нет $1
, $@
есть):
set argv arg1 arg2
В zsh
целях совместимости csh
вы также можете присвоить argv
массиву:
argv=(arg1 arg2)
argv[4]=arg4
И вы также можете сделать:
5=arg5
Это означает, что вы также можете делать такие вещи, как:
argv+=(another-arg)
добавить аргумент в конец, и:
argv[-1]=()
argv[2]=()
удалить аргумент с конца или середины, что вы не можете легко сделать с другими оболочками.
(find $1) /tmp
это синтаксическая ошибка На самом деле(any-command) more-arguments
это синтаксическая ошибка. Можете ли вы объяснить по-другому, что вы пытаетесь сделать?