Apa itu $ * dan $ # di Linux?

82

Apa arti variabel lingkungan berikut di Linux?

  1. Apa itu $ * (tanda dolar diikuti tanda bintang)?
  2. Apa itu $ # (tanda dolar di sebelah tanda hash / tanda angka / octothorpe / tanda pound)?
raghavayc
sumber

Jawaban:

115

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, $1argumen 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= -yesdll.

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.

Olli
sumber
1
Parameter khusus itu benar di semua shell Bourne-turunan (misalnya sh, bash, dash, ash, ksh, zsh).
Dennis Williamson
Koreksi: $*dan $#1) variabel shell, bukan variabel lingkungan; 2) terstandarisasi (bagian dari spesifikasi POSIX)
grawity
3
Juga perhatikan bahwa "$@"berkali-kali ditulis sebagai ${1+"$@"}(untuk alasan portabilitas), lihat stackoverflow.com/questions/743454/… untuk penjelasan.
hlovdal
Karena 'Nama perintah (parameter 0) tidak akan dihitung ...', dalam contoh di atas harus menjadi $ # = 2, mulai menghitung dari 0.
Josef Klimuk
0

$# mewakili sejumlah argumen:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3
Vikk_King
sumber
2
Selamat datang di Pengguna Super. Situs ini adalah basis pengetahuan, jadi tujuannya adalah bahwa setiap jawaban memberikan solusi untuk pertanyaan yang belum dikontribusikan. Ini hanya menjawab setengah dari pertanyaan, dan informasinya sudah tercakup dengan baik dalam jawaban sebelumnya.
fixer1234