Saya membuat tiga file di direktori saya menggunakan perintah touch inv{1..3}.txt
. Sekarang saya menggunakan dua perintah dan hasilnya hampir sama. Kedua perintah itu adalah ls inv[13].txt
dan ls {1,3}.txt
.
Jadi bagaimana keduanya berbeda? Bagaimana tanda kurung siku berbeda dengan kawat gigi? Saya juga mencari Google untuk "linux [..]", tetapi tidak dapat menemukan apa-apa, jadi bisakah saya tahu apa yang disebut dalam istilah linux?
Terima kasih
command-line
bash
scripts
posixKing
sumber
sumber
{}
dan Ekspansi Nama File> Pencocokan Pola untuk[]
.Jawaban:
{}
disebut ekspansi brace. Ini memiliki dua bentuk:{x..y}
dan{x,y}
, gantix
dany
dengan nilai alfabet atau numerik.Dalam bentuk pertama,
{x..y}
akan diperluas untuk semua nilai darix
key
, inklusif. Sebagai contoh,{2..5}
akan diperluas untuk2
,3
,4
,5
.Dalam bentuk eksplisit kedua,
{x,y}
akan diperluas hanyax
,y
. Misalnya,{2,5}
akan diperluas ke2
dan5
.Jika tidak ada ekspansi yang dimungkinkan, polanya diperlakukan secara harfiah misalnya dalam
{a..3}
.Hal penting yang perlu diperhatikan adalah bahwa ekspansi brace akan dilakukan (jika mungkin) terlepas dari kecocokan file apa pun, saat dalam pembuatan / pencocokan file.
[]
dikenal sebagai pola ekspansi pathname (atau globbing). Tidak seperti ekspansi brace, Anda hanya dapat menggunakannya saat mencocokkan nama file, itu akan diperlakukan secara harfiah jika Anda menggunakannya saat membuat file.Ini memiliki dua bentuk:
[xyz...]
dan[x-y]
.Dalam bentuk pertama, itu akan cocok dengan karakter tunggal di dalam tanda kurung secara terpisah. Yaitu setiap karakter diperlakukan secara individual. Jadi untuk
[25].txt
itu akan cocok dengan file bernama2.txt
atau5.txt
di direktori saat ini, sedangkan untuk[245].txt
itu akan cocok dengan file apa pun yang bernama2.txt
atau4.txt
atau5.txt
.Dalam bentuk kedua, ekspansi jangkauan dilakukan terlebih dahulu sebelum mencocokkan secara individual, jika mungkin diperlakukan secara harfiah. Jadi untuk
[2-5]. txt
, itu akan cocok dengan file apa pun yang bernama2.txt
atau3.txt
atau4.txt
atau5.txt
. Jika rentang tidak dapat diperluas, itu akan diperlakukan secara harfiah misalnya dalam kasus[a-3].txt
.Perbedaan perilaku yang penting antara keduanya adalah ketika ada lebih banyak pola yang cocok sementara yang sebenarnya kurang cocok. Karena ekspansi brace dilakukan tidak peduli apa pun, itu akan menunjukkan kesalahan bahwa file-file tertentu tidak ada sementara ekspansi pathname akan cocok dengan apa pun yang mungkin tanpa kesalahan untuk sisanya:
Catatan Portabilitas:
The
[]
Operator ekspansi path didefinisikan oleh POSIX maka portabel di antara Bourne shell dan turunannya.Perluasan brace,,
{}
tidak didefinisikan oleh POSIX sehingga tidak portabel di antara semua shell. Misalnya,dash
(sh
dalam Ubuntu) tidak memiliki ini. Hal itu dipinjam daricsh
dan akan bekerja pada kulit tertentu saja misalnyabash
,zsh
,ksh93
,fish
. Pastikan shell yang Anda gunakan mendukung ini sebelum menerapkan.Contoh:
sumber
[
]
ekspansi ketika tidak ada kecocokan karena itu bisa berbeda tergantung pada konfigurasi shell. Jika Anda ingin menggunakan[
atau]
dalam nama file, itu harus dikutip dalam perintah Anda. Perlu juga diperhatikan perbedaan antara{13..79}
dan[13-79]
. Yang pertama akan menghasilkan semua angka di kisaran dari13
ke79
, kedua akan cocok dengan karakter1
,3
,4
,5
,6
,7
, dan9
.nullglob
(atau serupa). Tentang[13-79]
pencocokan, saya pikir saya sebutkan dengan jelas dalam jawaban saya tentang perilaku per karakter [] `.ksh
memiliki fitur ini, tetapi bukan itu rasa yang lebih modern, seperti mksh dan pkdshPerbedaan utama antara kedua bentuk tersebut diilustrasikan di sini:
inv[15].txt
adalah glob dan akan memperluas daftar file yang cocok pada sistem file Anda. Ini adalah perluasan pathname .inv{1,5}.txt
memperluas keinv1.txt
daninv5.txt
terlepas dari file apa yang sebenarnya ada di sistem file Anda. Ini adalah ekspansi brace .sumber
ba{con,tman}
dan tidak ada yang setara dengan menggunakan tanda kurung. TKI, ekspansi brace tidak hanya untuk karakter tunggal.