Misalnya, periksa apakah $PWD
subdirektori dari / home. Dengan kata lain saya sedang mencari operasi string bash untuk memeriksa apakah satu string dimulai dengan yang lain.
25
Jika Anda ingin menguji apakah suatu direktori adalah subdirektori dari direktori lain, Anda akan membutuhkan lebih dari sekadar pemeriksaan awalan string. Jawaban Gilles menjelaskan secara rinci bagaimana melakukan tes ini dengan benar.
Tetapi jika Anda menginginkan pemeriksaan awalan string sederhana (mungkin Anda sudah menormalkan jalur Anda?), Ini bagus:
test "${PWD##/home/}" != "${PWD}"
Jika $PWD
dimulai dengan "/ home /", itu akan dilepas di sisi kiri, yang berarti tidak akan cocok dengan sisi kanan, jadi "! =" Mengembalikan true.
[ "${PWD##$VAR}" != "$PWD" ]
Dan jika ini adalah [kode-golf] ( stackoverflow.com/questions/tagged/code-golf)question Anda akan mengalahkan saya dengan dua karakter ;-) Juga terlihat lebih mudah dibaca ...${PWD/#$HOME/\~}
"${PWD%%/subdir*}"
untuk mendeteksi apakah pengguna saat ini berada disubdir
atau dalam subdirektorisubdir
, karena %% menangkap dari akhir string, bukan dari awal. Ini harus bermanfaat bagi siapa pun yang mencari informasi lebih lanjut tentang substitusi parameter: tldp.org/LDP/abs/html/parameter-substitution.htmlUntuk menguji apakah suatu string adalah awalan dari yang lain, dalam shell gaya Bourne apa pun:
Prinsip yang sama berfungsi untuk tes sufiks atau substring. Perhatikan bahwa dalam
case
konstruksi, tidak seperti dalam nama file,*
cocok dengan karakter apa pun, termasuk a/
atau inisial.
.Dalam shell yang mengimplementasikan
[[ … ]]
sintaksis (yaitu bash, ksh dan zsh), itu dapat digunakan untuk mencocokkan string dengan suatu pola. (Perhatikan bahwa[
perintah hanya dapat menguji string untuk kesetaraan.)Jika Anda secara khusus menguji apakah direktori saat ini berada di bawahnya
/home
, tes substring sederhana tidak cukup, karena tautan simbolik.Jika
/home
adalah filesystem-nya sendiri, uji apakah direktori saat ini (.
) ada pada filesystem itu.Jika Anda memiliki NetBSD, OpenBSD atau GNU (yaitu Linux)
readlink
, Anda dapat menggunakanreadlink -f
untuk menghapus tautan simbolik dari sebuah jalur.Jika tidak, Anda dapat menggunakan
pwd
untuk menampilkan direktori saat ini. Tetapi Anda harus berhati-hati untuk tidak menggunakan shell built-in jika shell Anda melacakcd
perintah dan menjaga nama yang Anda gunakan untuk mencapai direktori daripada lokasi "aktual".sumber
Versi kasar:
Memiliki kelemahan yaitu seseorang harus menghitung karakter terlebih dahulu dan seseorang tidak dapat mengganti
/home/
dengan sesuatu yang umum seperti$1
.sunting (terima kasih @Michael) untuk generalisasi untuk dibandingkan dengan yang
$VAR
dapat digunakansumber
${#var}
adalah panjangnya$var
, sehingga Anda dapat menggeneralisasikannya sebagai[ "${PWD:0:${#1}}" = "$1" ]
Saya tidak mengerti pertanyaannya dengan baik, tetapi untuk menemukan orang tua dari $ PWD , lakukan
dirname $PWD
. Untuk menemukan induk dari induk, jalankandirname $(dirname $PWD)
, dan seterusnya ...sumber
/
. Oke, saya bisa mengeceknya secara rekursif, tetapi tidak adakah yang lebih mudah?Menggunakan
awk
:sumber
Hm, sayang sekali yang
[
tidak memiliki opsiSTRING1 starts with STRING2
kondisi pengujian .Anda dapat mencoba
echo $PWD | grep '^$VAR'
, tetapi bisa gagal dengan cara yang menarik ketikaVAR
berisi simbol-simbol khusus.awk
'sindex
fungsi harus dapat melakukan trik. Tetapi semua ini tampaknya terlalu berat untuk hal yang mudah untuk diuji.sumber
Jika bagian yang dicari dari jalur ditemukan, saya "mengosongkan" variabel:
sumber