Иногда необходимо эмулировать и проверять вышеуказанные переменные в небольших примерах, а затем сразу же скопировать их в какой-либо сценарий и т. Д.
Я попытался решить, используя простой пример, следующими способами:
(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh
и с другими комбинациями. Также экспериментировал, добавив директиву интерпретатора shebang #!/bin/sh -x
, но не получил желаемого результата.
Могу ли я сделать это просто?
(find $1) /tmp
это синтаксическая ошибка На самом деле(any-command) more-arguments
это синтаксическая ошибка. Можете ли вы объяснить по-другому, что вы пытаетесь сделать?rc
семьи (rc
,es
,akanga
...), где в этом случае это эквивалентноfind $1 /tmp
.Ответы:
Первый аргумент после
sh -c inline-script
идет к$0
(который также используется для сообщений об ошибках), а остальные идут$1
,$2
...Итак, вы хотите:
(в прежние времена вы могли найти
sh
реализации, в которые$1
вместо этого входил первый аргумент , так что вы бы сделали:Или:
чтобы объяснить оба поведения, но эти оболочки исчезли теперь, когда POSIX является распространенным и общедоступным).
Если вы хотите установить
$1
,$2
в локальной области внутри текущей оболочки, вы будете использовать функции. В борновоподобных оболочках:Некоторые оболочки поддерживают анонимные функции. Это случай
zsh
:Или
es
:Для постоянного изменения текущих позиционных параметров синтаксис зависит от оболочки. dchirikov уже покрыл Bourne-подобных оболочках (Bourne, Korn,
bash
,zsh
, POSIX,ash
,yash
...).Синтаксис:
Однако вам необходимо:
Чтобы очистить этот список (или
shift "$#"
) иустановить
$1
что-то, начинающееся с-
или+
, так что это хорошая привычка всегда использовать,set --
особенно когда используются произвольные данные, такие какset -- "$@" other-arg
добавление аргументов в конец списка позиционных параметров.В оболочках
csh
семейства (csh
,tcsh
) вы присваиваетеargv
массиву:В оболочках
rc
семьи (rc
,es
,akanga
), в*
массиве:Хотя вы также можете назначить элементы индивидуально:
В
fish
позиционные параметры вargv
массиве только (нет$1
,$@
есть):В
zsh
целях совместимостиcsh
вы также можете присвоитьargv
массиву:И вы также можете сделать:
Это означает, что вы также можете делать такие вещи, как:
добавить аргумент в конец, и:
удалить аргумент с конца или середины, что вы не можете легко сделать с другими оболочками.
источник
это то, что вам нужно:
источник