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.
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.
Jawaban:
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/#$HOME/\~}
"${PWD%%/subdir*}"
untuk mendeteksi apakah pengguna saat ini berada di subdir
atau dalam subdirektori subdir
, 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.html
Untuk menguji apakah suatu string adalah awalan dari yang lain, dalam shell gaya Bourne apa pun:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
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.)
if [[ $PWD/ = /home/* ]]; then …
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.
if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
echo 'The current directory is on the /home filesystem'
fi
Jika Anda memiliki NetBSD, OpenBSD atau GNU (yaitu Linux) readlink
, Anda dapat menggunakan readlink -f
untuk menghapus tautan simbolik dari sebuah jalur.
case $(readlink -f .)/ in $(readlink -f /home)/*) …
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 melacak cd
perintah dan menjaga nama yang Anda gunakan untuk mencapai direktori daripada lokasi "aktual".
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
Versi kasar:
[ ${PWD:0:6} = "/home/" ]
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 digunakan
[ "${PWD:0:${#VAR}}" = $VAR ]
${#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, jalankan dirname $(dirname $PWD)
, dan seterusnya ...
/
. Oke, saya bisa mengeceknya secara rekursif, tetapi tidak adakah yang lebih mudah?
Menggunakan awk
:
echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'
Hm, sayang sekali yang [
tidak memiliki opsi STRING1 starts with STRING2
kondisi pengujian .
Anda dapat mencoba echo $PWD | grep '^$VAR'
, tetapi bisa gagal dengan cara yang menarik ketika VAR
berisi simbol-simbol khusus.
awk
's index
fungsi harus dapat melakukan trik. Tetapi semua ini tampaknya terlalu berat untuk hal yang mudah untuk diuji.
Jika bagian yang dicari dari jalur ditemukan, saya "mengosongkan" variabel:
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${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 ...