Apa variabel shell tanda dolar khusus?

782

Di Bash, tampaknya ada beberapa variabel yang memiliki nilai spesial, yang secara konsisten bermakna. Contohnya,

./myprogram &; echo $!

akan mengembalikan PID dari proses yang dilatar belakangi myprogram. Saya tahu orang lain, seperti $?yang saya pikir adalah TTY saat ini. Apakah ada yang lain?

Z Douglas
sumber
15
Beberapa dari mereka bukan hanya Bash. Mereka juga digunakan dalam cangkang terkait Bourne lainnya dan pada kenyataannya ditentukan oleh POSIX .
Dijeda sampai pemberitahuan lebih lanjut.
1
Bagaimana dengan: IFS = $ '\ n' Lihat: stackoverflow.com/questions/4128235/…
sgu
1
@sgu Itu bukan parameter; itu jenis kutipan khusus. $'\n'adalah karakter baris baru literal yang dihasilkan dari penggantian digraf \ndengan ASCII 10.
chepner
Jika Anda datang ke sini mencari ${1}, ${*}, dll, kawat gigi hanya untuk disambiguasi, dan sering berlebihan. Dalam isolasi, ${x}persis sama dengan $x.
tripleee
Apa $!artinya Saya sadar !$tapi tidak begitu.
Sridhar Sarnobat

Jawaban:

1360
  • $1, $2, $3, ... adalah parameter posisi .
  • "$@"adalah susunan seperti array dari semua parameter posisi {$1, $2, $3 ...},.
  • "$*"adalah perluasan IFS dari semua parameter posisi $1 $2 $3 ...,.
  • $# adalah jumlah parameter posisi.
  • $- opsi saat ini ditetapkan untuk shell.
  • $$ pid dari shell saat ini (bukan subkulit).
  • $_ parameter terbaru (atau jalur abs dari perintah untuk memulai shell saat ini segera setelah startup).
  • $IFS adalah pemisah bidang (input).
  • $? adalah status keluar pipa foreground terbaru.
  • $! adalah PID dari perintah latar belakang terbaru.
  • $0 adalah nama dari shell atau skrip shell.

Sebagian besar di atas dapat ditemukan di bawah Parameter Khusus dalam Manual Referensi Bash. Ada semua variabel lingkungan yang ditetapkan oleh shell .

Untuk indeks komprehensif, silakan lihat Indeks Variabel Manual Referensi .

kojiro
sumber
2
Semuanya didokumentasikan di bashhalaman manual. Satu-satunya keanehan adalah yang $_hanya disebutkan dalam konteks penggunaannya dalam MAILPATHvariabel.
chepner
4
@chepner lihat di man(1) bashbawah Parameter Khusus untuk sisa definisi $_.
kojiro
8
Saya menggunakan !$alih-alih $_dalam skrip bash, karena yang terakhir terkadang gagal.
amc
Daftar bagus kojiro. Saya menemukan sintaks ini $ {1 + "$ @"} apa artinya itu?
user178047
3
@amc: Lihat unix.stackexchange.com/questions/271659/... perbedaan antara !$dan $_.
tricasse
44
  • $_ argumen terakhir dari perintah terakhir
  • $# jumlah argumen yang diteruskan ke skrip saat ini
  • $*/ $@daftar argumen yang diteruskan ke skrip sebagai string / daftar terbatas

Dari atas kepala saya. Google untuk variabel khusus bash.

Dan
sumber
124
"Ya. Mereka mengirim saya ke sini." - Lempar buku toko (dokumen resmi: gnu.org/software/bash/manual/bashref.html#Special-Parameters )
greggo
1
Saya pikir $@adalah string dan $*daftar dibatasi (menurut jawaban yang diterima di atas, lagipula).
RastaJedi
1
@RastaJedi: "$@"memperluas ke daftar, "$*"memperluas ke string tunggal. Perilaku khusus $@berlaku ketika itu dalam tanda kutip ganda.
Keith Thompson
6
Diturunkan karena ini bukan jawaban yang sangat lengkap atau membantu. Mengatakan "Google it" menunjukkan kurangnya usaha, terutama mengingat bahwa sebagian besar orang berakhir di sini dari pencarian Google. Saya pikir yang paling bisa Anda lakukan adalah menambahkan tautan ke dokumentasi resmi. TBH, satu-satunya alasan saya tidak menandainya untuk dihapus adalah karena itu setidaknya sebagian jawaban untuk pertanyaan. Saya tahu ini sudah tua, tetapi harap pertimbangkan untuk mengeditnya untuk memberikan detail lebih lanjut.
Sean the Bean
15

Untuk membantu memahami apa yang dilakukan $#, $0dan $1, ... $nlakukan, saya menggunakan skrip ini:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

Menjalankannya mengembalikan output yang representatif:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine
fedorqui 'SO berhenti merugikan'
sumber
4
Apa maksudnya! Maksud saya untuk loop Anda? Itulah sebenarnya mengapa saya di sini dan saya tidak dapat menemukan jawaban di mana pun karena saya tidak tahu harus menyebutnya apa.
Anthony
7
@Anthony ini disebut indirection variabel . Anda dapat menemukan penjelasan yang baik tentang penggunaannya di bash: ekspansi tidak langsung, tolong jelaskan? .
fedorqui 'SO stop harming'
3

Perhatikan beberapa contoh; $ 0 dapat mencakup beberapa jalur utama serta nama program. Misalnya, simpan skrip dua baris ini sebagai ./mytry.sh dan jalankan.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Keluaran:

parameter 0 --> ./mytry.sh

Ini adalah versi Bash (tahun 2016) saat ini, melalui Slackware 14.2

Adrian Cole
sumber
5
Apakah $ 0 termasuk lintasan atau tidak tergantung pada bagaimana Anda menjalankan skrip di tempat pertama. Jika Anda mengeksekusi "./mytry.sh" itulah yang akan Anda lihat dalam $ 0. Jika Anda memasukkan "~ / mytry.sh" Anda akan melihat path lengkap (karena shell akan diperluas ~). Jika Anda melakukannya ". Mytry.sh" Anda akan melihat 'bash'.
Steve Folly