Argumen pertama setelah sh -c inline-script
masuk ke $0
(yang juga digunakan untuk pesan kesalahan), dan sisanya masuk $1
, $2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Jadi kamu mau:
sh -c 'find "$1"' sh /tmp
(di masa lalu, Anda bisa menemukan sh
implementasi di mana arg pertama masuk $1
sebagai gantinya, sehingga Anda akan melakukan:
sh -c 'find "$1"' /tmp /tmp
Atau:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
untuk menjelaskan kedua perilaku, tetapi cangkang tersebut hilang sekarang karena POSIX sudah umum dan tersedia untuk umum).
Jika Anda ingin mengatur $1
, $2
dalam lingkup lokal di dalam shell saat ini, di situlah Anda akan menggunakan fungsi. Dalam cangkang mirip Bourne:
my_func() {
find "$1"
}
my_func /tmp
Beberapa shell mendukung fungsi anonim. Itu adalah kasus zsh
:
(){find "$1"} /tmp
Atau es
:
@{find $1} /tmp
Untuk mengubah parameter posisi saat ini, secara permanen, sintaks bergantung pada shell. dchirikov telah menutupi Bourne-seperti kerang (Bourne, Korn, bash
, zsh
, POSIX, ash
, yash
...).
Sintaksnya adalah:
set arg1 arg2 ... argn
Namun, Anda perlu:
set --
Untuk mengosongkan daftar itu (atau shift "$#"
) dan
set -- -foo
untuk mengatur $1
sesuatu yang dimulai dengan -
atau +
, jadi itu kebiasaan yang baik untuk selalu menggunakan set --
terutama ketika menggunakan data arbitrer seperti set -- "$@" other-arg
menambahkan argumen ke akhir daftar parameter posisi.
Dalam shell csh
keluarga ( csh
, tcsh
), Anda menetapkan ke argv
array:
set argv=(arg1 arg2)
Dalam kerang dari rc
keluarga ( rc
, es
, akanga
), dengan *
array yang:
*=(arg1 arg2)
Meskipun Anda juga dapat menetapkan elemen secara individual:
2=arg2
Dalam fish
, parameter posisi berada di argv
array yang hanya (tidak $1
, $@
ada):
set argv arg1 arg2
Di zsh
, untuk kompatibilitas dengan csh
, Anda juga dapat menetapkan ke argv
array:
argv=(arg1 arg2)
argv[4]=arg4
Dan Anda juga bisa melakukan:
5=arg5
Itu berarti Anda juga dapat melakukan hal-hal seperti:
argv+=(another-arg)
untuk menambahkan argumen di akhir, dan:
argv[-1]=()
argv[2]=()
untuk menghapus argumen dari ujung atau tengah, yang tidak mudah Anda lakukan dengan shell lain.
(find $1) /tmp
adalah kesalahan sintaksis. Sebenarnya(any-command) more-arguments
ini adalah kesalahan sintaksis. Bisakah Anda menjelaskan secara berbeda apa yang Anda coba lakukan?