Pertanyaan Apa yang dilakukan dengan $ {0% / *} dalam skrip shell?


Maaf jika ini adalah pertanyaan bodoh, tetapi saya mencari tentang itu tanpa hasil.

Apa tepatnya yang dilakukan oleh baris kedua?

#!/bin/sh
cd ${0%/*} || exit 1

Saya tahu yang pertama adalah shebang, yang kedua mencoba untuk mengubah direktori tetapi bagian yang membingungkan adalah ${0%/*}.

Bisakah Anda jelaskan saya bahwa baris kedua?


16
2018-01-06 22:25


asal


Seperti yang dijelaskan oleh Andrea dalam jawaban, $ {0% / *} diterjemahkan ke jalur direktori yang diawali dengan nama skrip saat memohonnya. Alternatifnya adalah menggunakan built-in dirname perintah seperti $(dirname $0) - alwayslearning
@alwayslearning: Versi shell dan shell apa yang Anda gunakan itu dirname dibangun di? Ini tentu tidak di Bash v4.3.11 yang merupakan shell default di Ubuntu Trusty. - David Foerster
Maafkan saya untuk kebingungan, hanya memeriksa itu dirname bukan shell built-in. - alwayslearning


Jawaban:


${0} adalah argumen pertama dari skrip, yaitu nama atau jalur skrip. Jika Anda meluncurkan skrip Anda sebagai path/to/script.sh, kemudian ${0} akan persis string itu: path/to/script.sh.

Itu %/* bagian memodifikasi nilai ${0}. Artinya: ambil semua karakter sampai / diikuti oleh nama file. Dalam contoh di atas, ${0%/*} akan path/to.

Anda dapat melihatnya beraksi di shell Anda:

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to

Sh mendukung banyak jenis "substitusi parameter" lainnya. Berikut ini, misalnya, cara mengambil nama file alih-alih jalur:

$ echo "${x##*/}"
script.sh

Secara umum, % dan %% lepaskan sufiks, sementara # dan ## strip awalan. Anda dapat membaca lebih lanjut tentang substitusi parameter.


27
2018-01-06 22:34



Ini "|| exit 1" tampaknya tidak perlu: apakah itu akan menjadi noway untuk mengubah dir $? sama dengan 1. - Josef Klimuk
Ini akan bagus untuk menyebutkan konstruk didokumentasikan sebagai "Hapus pencocokan awalan / akhiran pola" di manual. Juga cara yang bagus untuk mengingat yang mana adalah # shift 3 (kiri $),% adalah shift 5 (kanan $), setidaknya di keyboard AS. - chexum
@JosefKlimuk: the || exit 1  mungkin diperlukan karena cd mungkin keluar dengan status 2, bukan 1, pada kesalahan. Namun saya setuju bahwa itu tidak terlalu berguna (biasanya program tidak peduli dengan status keluar tertentu). Mungkin ini bagian dari naskah yang lebih besar? - Andrea Corbellini
@AndreaCorbellini Tentunya benar. Cukup banyak cara yang bisa digunakan sama sekali adalah sebagai bagian dari skrip yang lebih besar. Skrip yang baru saja mengubah direktori saat ini tidak berpengaruh, karena hanya mempengaruhi shell yang menjalankan satu skrip itu. Proses orangtua tidak pernah melihatnya. - hvd