Перший аргумент після того, як 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
в локальній області в межах поточної оболонки, що, де ви будете використовувати функції. У Bourne-подібних снарядів:
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
це синтаксична помилка. Чи можете ви пояснити по-різному, що ви намагаєтесь зробити?