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?


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 .


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.


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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.