Setiap kali saya mencari ini, saya biasanya menemukan bagian kanan halaman bash man dengan mencari %%atau ##, karena itu cukup mudah diingat dan langka untuk menemukan bagian yang tepat dengan cepat. man bash/##
Peter Cordes
3
@PeterCordes Saya selalu ingat ini dengan "Ini 5%, jadi% di akhir dan dengan demikian memotong dari akhir. Dan itu # 5, jadi # di awal dan memotong dari awal." Tetapi kadang-kadang saya bahkan mencampuradukkan yang ini ...
glglgl
2
@glglgl: Pada papan ketik khas Amerika Serikat, #langsung ke kiri $, dan %langsung ke kanan. Tidak perlu mnemonik --- lihat saja ke bawah. (Itu mungkin setidaknya bagian dari mengapa simbol-simbol itu dipilih.)
Kevin J. Chase
@ KevinJ.Chase Tidak semua orang di seluruh dunia memiliki keyboard khas Amerika Serikat. Tapi tentu saja, pada keyboard Jerman,% benar $ juga, itu bisa menjadi awal untuk memoizing.
glglgl
Jawaban:
29
Ketika %digunakan dalam pola ${variable%substring}itu akan mengembalikan konten variabledengan kejadian terpendek substringdihapus dari belakang variable.
Fungsi ini mendukung pola wildcard - itulah sebabnya ia menerima bintang (tanda bintang) sebagai subtitle untuk nol atau lebih karakter.
Harus disebutkan bahwa ini khusus untuk Bash - shell linux lain tidak perlu mengandung fungsi ini.
Jika Anda ingin mempelajari lebih lanjut tentang manipulasi string di Bash, saya sangat menyarankan membaca halaman ini . Di antara fungsi praktis lainnya - misalnya - menjelaskan apa yang %%harus dilakukan :)
Edit: Saya lupa menyebutkan bahwa ketika itu digunakan dalam pola $((variable%number))atau $((variable1%$variable2))yang %karakter akan berfungsi sebagai operator modulo. DavidPostill memiliki tautan dokumentasi yang lebih spesifik dalam jawabannya.
Ketika %digunakan dalam konteks yang berbeda, itu harus dikenali sebagai karakter biasa saja.
Operator mendukung pola wildcard , bukan ekspresi reguler.
gardenhead
Seperti gardenhead yang disebutkan - mendukung pola glob, bukan ekspresi reguler. Dalam ekspresi reguler, bintang berarti nol atau lebih dari karakter sebelumnya.
Awalan dan akhiran menghapus operator adalah standar , sehingga mereka harus dapat digunakan dalam shshell yang kompatibel, tidak hanya Bash. (Meskipun mungkin tidak dalam cshdan sejenisnya).
ilkkachu
1
Konteks lain yang %digunakan adalah penentu format untuk printf.
The Kata diperluas untuk menghasilkan pola seperti dalam ekspansi nama file. Jika pola cocok dengan bagian tambahan dari nilai parameter yang diperluas , maka hasil ekspansi adalah nilai parameter dengan pola pencocokan terpendek ( ‘%’kasing) atau pola pencocokan terpanjang ( ‘%%’kasing) dihapus. Jika parameter adalah ‘@’atau ‘*’,operasi penghapusan pola diterapkan untuk setiap parameter posisional pada gilirannya, dan ekspansi adalah daftar yang dihasilkan. Jika parameter adalah variabel array yang disubkripsikan dengan ‘@’
atau‘*’, operasi penghapusan pola diterapkan pada setiap anggota array secara bergantian, dan ekspansi adalah daftar yang dihasilkan.
NB beberapa perluasan parameter termasuk% adalah fitur posix yang didukung banyak shell.
kojiro
7
Dengan bereksperimen, saya menemukan bahwa kecocokan setelah% dibuang, ketika string tertutup dalam kurung keriting (kurung kurawal).
Menggambarkan:
touch abcd # Create file abcd
for file in ab*; do
echo $file # echoes the filename
echo $file% # echoes the filename plus "%"
echo ${file%} # echoes the filename
echo "${file%}" # echoes the filename
echo
echo "${file%c*}" # Discard anything after % matching c*
echo "${file%*}" # * is not greedy
echo ${file%c*} # Without quotes works too
echo "${file%c}" # No match after %, no effect
echo $file%c* # Without {} fails
done
Mungkin saya mengerti: ini untuk hal-hal seperti .*dan %mendefinisikannya sebagai tidak serakah sedangkan %%membuatnya serakah? Jadi sebenarnya dalam contoh ganti nama itu tidak masalah apakah akan menggunakan %atau %%tetapi jika mv "$file" "${file%.*png.jpg}.jpg"(perhatikan *) menggunakan %% akan mengubah nama semua file menjadi adil .jpg, kan?
Thomas Weller
@ ThomasWeller saya pikir itu benar. Tapi aku bukan ahli bash.
DavidPostill
Mengatakan "Hapus ... bagian terpendek dari $Pattern" salah karena variabel $Patterntidak didefinisikan dalam contoh, hanya teks "Pola" yang dihapus dari $varsaat melakukan ${var%Pattern}atau ${var%%Pattern}. Mungkin ini hanya salah ketik, tapi ini contoh lain kesalahan tldp.org. BashGuide atau Bash Hackers Wiki keduanya adalah referensi yang jauh lebih baik.
John B
@ JohnB Terima kasih. Kedua tautan itu ditandai. Saya sudah mengoreksi teks dalam jawaban.
%%
atau##
, karena itu cukup mudah diingat dan langka untuk menemukan bagian yang tepat dengan cepat.man bash
/##
#
langsung ke kiri$
, dan%
langsung ke kanan. Tidak perlu mnemonik --- lihat saja ke bawah. (Itu mungkin setidaknya bagian dari mengapa simbol-simbol itu dipilih.)Jawaban:
Ketika
%
digunakan dalam pola${variable%substring}
itu akan mengembalikan kontenvariable
dengan kejadian terpendeksubstring
dihapus dari belakangvariable
.Fungsi ini mendukung pola wildcard - itulah sebabnya ia menerima bintang (tanda bintang) sebagai subtitle untuk nol atau lebih karakter.
Harus disebutkan bahwa ini khusus untuk Bash - shell linux lain tidak perlu mengandung fungsi ini.
Jika Anda ingin mempelajari lebih lanjut tentang manipulasi string di Bash, saya sangat menyarankan membaca halaman ini . Di antara fungsi praktis lainnya - misalnya - menjelaskan apa yang
%%
harus dilakukan :)Edit: Saya lupa menyebutkan bahwa ketika itu digunakan dalam pola
$((variable%number))
atau$((variable1%$variable2))
yang%
karakter akan berfungsi sebagai operator modulo. DavidPostill memiliki tautan dokumentasi yang lebih spesifik dalam jawabannya.Ketika
%
digunakan dalam konteks yang berbeda, itu harus dikenali sebagai karakter biasa saja.sumber
sh
shell yang kompatibel, tidak hanya Bash. (Meskipun mungkin tidak dalamcsh
dan sejenisnya).%
digunakan adalah penentu format untukprintf
.sumber
Dengan bereksperimen, saya menemukan bahwa kecocokan setelah% dibuang, ketika string tertutup dalam kurung keriting (kurung kurawal).
Menggambarkan:
Berikut hasilnya:
sumber
Di Linux shell (
bash
), apa fungsinya%
?Dalam kasus ini,
%
adalah pencocokan pola operator (perhatikan juga bisa menjadi modulo operator).Operator Pencocokan Pola
Substitusi Parameter Sumber
Operator Modulo
Operator Sumber
sumber
.*
dan%
mendefinisikannya sebagai tidak serakah sedangkan%%
membuatnya serakah? Jadi sebenarnya dalam contoh ganti nama itu tidak masalah apakah akan menggunakan%
atau%%
tetapi jikamv "$file" "${file%.*png.jpg}.jpg"
(perhatikan *) menggunakan %% akan mengubah nama semua file menjadi adil.jpg
, kan?$Pattern
" salah karena variabel$Pattern
tidak didefinisikan dalam contoh, hanya teks "Pola" yang dihapus dari$var
saat melakukan${var%Pattern}
atau${var%%Pattern}
. Mungkin ini hanya salah ketik, tapi ini contoh lain kesalahan tldp.org. BashGuide atau Bash Hackers Wiki keduanya adalah referensi yang jauh lebih baik.