Jawaban:
Dari sini :
$# Stores the number of command-line arguments that
were passed to the shell program.
$? Stores the exit value of the last command that was
executed.
$0 Stores the first word of the entered command (the
name of the shell program).
$* Stores all the arguments that were entered on the
command line ($1 $2 ...).
"$@" Stores all the arguments that were entered
on the command line, individually quoted ("$1" "$2" ...).
Jadi pada dasarnya, $#
sejumlah argumen diberikan ketika skrip Anda dieksekusi. $*
adalah string yang berisi semua argumen. Misalnya, $1
argumen pertama dan seterusnya. Ini berguna, jika Anda ingin mengakses argumen tertentu dalam skrip Anda.
Seperti yang dikomentari Brian, ini adalah contoh sederhana. Jika Anda menjalankan perintah berikut:
./command -yes -no /home/username
$#
= 3$*
= -yes -no /home/username
$@
= array: {"-yes", "-no", "/home/username"}
$0
= ./command
, $1
= -yes
dll.Ini adalah bagian dari standar POSIX , dan harus didukung oleh semua shell yang sesuai. Untuk referensi, di bawah ini adalah definisi standar POSIX untuk setiap parameter khusus. Perhatikan ada tiga variabel tambahan: $-
, $$
dan $!
.
$@
:
Perluas ke parameter posisi, mulai dari satu. Ketika ekspansi terjadi dalam tanda kutip ganda, dan di mana pemisahan bidang (lihat Field Splitting ) dilakukan, setiap parameter posisi harus diperluas sebagai bidang terpisah, dengan ketentuan bahwa perluasan parameter pertama harus tetap bergabung dengan bagian awal dari kata aslinya (dengan asumsi bahwa parameter yang diperluas telah disematkan dalam sebuah kata), dan perluasan dari parameter terakhir masih harus digabungkan dengan bagian terakhir dari kata aslinya. Jika tidak ada parameter posisi, perluasan '@' akan menghasilkan nol bidang, bahkan ketika '@' dikutip ganda.
$*
:
Perluas ke parameter posisi, mulai dari satu. Ketika ekspansi terjadi dalam string kutipan ganda (lihat Kutipan Ganda ), itu akan diperluas ke bidang tunggal dengan nilai setiap parameter dipisahkan oleh karakter pertama dari variabel IFS, atau dengan jika IFS tidak disetel. Jika IFS diatur ke string nol, ini tidak setara dengan membatalkannya; karakter pertamanya tidak ada, sehingga nilai parameter digabungkan.
$#
:
Memperluas jumlah desimal parameter posisi. Nama perintah (parameter 0) tidak boleh dihitung dalam angka yang diberikan oleh '#' karena itu adalah parameter khusus, bukan parameter posisional.
$?
:
Perluas ke status keluar desimal dari saluran pipa terbaru (lihat Saluran Pipa ).
$-
:
(Tanda hubung.) Memperluas ke flag opsi saat ini (nama opsi huruf tunggal disatukan menjadi string) seperti yang ditentukan pada doa, dengan perintah bawaan bawaan yang ditetapkan , atau secara implisit oleh shell.
$$
:
Memperluas ID proses desimal dari shell yang dipanggil. Dalam subkulit (lihat Lingkungan Eksekusi Shell ), '$' akan meluas ke nilai yang sama dengan shell saat ini.
$!
:
Memperluas ID proses desimal dari perintah latar belakang terbaru (lihat Daftar ) yang dieksekusi dari shell saat ini. (Misalnya, perintah latar belakang yang dijalankan dari subkulit tidak memengaruhi nilai "$!" Di lingkungan shell saat ini.) Untuk pipa, ID proses adalah perintah terakhir dalam pipa.
$0
:
(Nol.) Memperluas nama shell atau skrip shell. Lihat sh untuk deskripsi terperinci tentang bagaimana nama ini diturunkan.
$*
dan $#
1) variabel shell, bukan variabel lingkungan; 2) terstandarisasi (bagian dari spesifikasi POSIX)
"$@"
berkali-kali ditulis sebagai ${1+"$@"}
(untuk alasan portabilitas), lihat stackoverflow.com/questions/743454/… untuk penjelasan.
$#
mewakili sejumlah argumen:
[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1
[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3