Đối số đầu tiên sau khi sh -c inline-script
đi đến $0
(cũng được sử dụng cho các thông báo lỗi) và phần còn lại đi vào $1
, $2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Vậy bạn muốn:
sh -c 'find "$1"' sh /tmp
(vào thời xa xưa, bạn có thể tìm thấy các sh
triển khai trong đó đối số đầu tiên đã đi vào $1
, vì vậy bạn sẽ làm:
sh -c 'find "$1"' /tmp /tmp
Hoặc là:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
để giải thích cho cả hai hành vi, nhưng những cái vỏ đó đã biến mất khi POSIX phổ biến và có sẵn công khai).
Nếu bạn muốn đặt $1
, $2
trong phạm vi cục bộ trong trình bao hiện tại, đó là nơi bạn sử dụng các hàm. Trong vỏ giống như Bourne:
my_func() {
find "$1"
}
my_func /tmp
Một số shell hỗ trợ các chức năng ẩn danh. Đó là trường hợp của zsh
:
(){find "$1"} /tmp
Hoặc es
:
@{find $1} /tmp
Để thay đổi các tham số vị trí hiện tại, vĩnh viễn, cú pháp phụ thuộc vào shell. dchirikov đã bao phủ Bourne giống như vỏ (Bourne, Korn, bash
, zsh
, POSIX, ash
, yash
...).
Cú pháp là:
set arg1 arg2 ... argn
Tuy nhiên, bạn cần:
set --
Để trống danh sách đó (hoặc shift "$#"
) và
set -- -foo
để đặt $1
thành một cái gì đó bắt đầu bằng -
hoặc +
, vì vậy, đó là một thói quen tốt để luôn luôn sử dụng set --
đặc biệt là khi sử dụng dữ liệu tùy ý như set -- "$@" other-arg
thêm các đối số vào cuối danh sách tham số vị trí.
Trong shell của csh
gia đình ( csh
, tcsh
), bạn gán cho argv
mảng:
set argv=(arg1 arg2)
Trong vỏ của rc
gia đình ( rc
, es
, akanga
), để các *
mảng:
*=(arg1 arg2)
Mặc dù bạn cũng có thể chỉ định các yếu tố riêng lẻ:
2=arg2
Trong fish
, các tham số vị trí đang trong argv
mảng chỉ (không $1
, $@
ở đó):
set argv arg1 arg2
Trong zsh
, để tương thích với csh
, bạn cũng có thể gán cho argv
mảng:
argv=(arg1 arg2)
argv[4]=arg4
Và bạn cũng có thể làm:
5=arg5
Điều đó có nghĩa là bạn cũng có thể làm những việc như:
argv+=(another-arg)
để thêm một đối số vào cuối và:
argv[-1]=()
argv[2]=()
để loại bỏ một đối số từ cuối hoặc giữa, điều mà bạn không thể dễ dàng thực hiện với các shell khác.
(find $1) /tmp
là một lỗi cú pháp. Thực tế(any-command) more-arguments
là một lỗi cú pháp. Bạn có thể giải thích khác nhau những gì bạn đang cố gắng làm?