Örneğin $PWD, / home alt dizini olup olmadığını kontrol edin . Başka bir deyişle, bir dize diğeriyle başlayıp başlamadığını kontrol etmek için bir bash string işlemi arıyorum.
Örneğin $PWD, / home alt dizini olup olmadığını kontrol edin . Başka bir deyişle, bir dize diğeriyle başlayıp başlamadığını kontrol etmek için bir bash string işlemi arıyorum.
Yanıtlar:
Bir dizinin bir başkasının alt dizini olup olmadığını güvenilir bir şekilde test etmek istiyorsanız, bir dize öneki kontrolünden daha fazlasına ihtiyacınız olacaktır. Gilles'un cevabı bu testin nasıl yapıldığını ayrıntılı olarak açıklar.
Ancak basit bir dize önek kontrolü yapmak istiyorsanız (belki de yollarınızı normalleştirdiniz mi?), Bu iyi bir durum:
test "${PWD##/home/}" != "${PWD}"
Eğer $PWD"/ home /" ile başlar, bunun "! =" True değerini döndürür, böylece sağ tarafını maç anlamına gelir sol tarafında, içinde sıyrılıp alır.
${PWD/#$HOME/\~}
"${PWD%%/subdir*}"Kullanıcının şu anda subdirbir alt dizininde mi yoksa alt dizininde mi olduğunu tespit etmek için kullanın subdir, çünkü %% başlangıç yerine dizenin sonundan yakalanır. Bu, parametre değişimi hakkında daha fazla bilgi edinmek isteyen herkes için yararlı olmalıdır: tldp.org/LDP/abs/html/parameter-substitution.html
Bir dizenin bir Bourne tarzı kabuğunda bir başkasının öneki olup olmadığını test etmek için:
case $PWD/ in
/home/*) echo "home sweet home";;
*) echo "away from home";;
esac
Aynı prensip bir son ek veya alt dize testi için de geçerlidir. İçinde olduğunu unutmayın caseyapılara, dosya adlarında aksine *bir de dahil olmak üzere herhangi bir karakterle, kibrit /veya bir başlangıç ..
[[ … ]]Sözdizimini uygulayan kabuklarda (yani bash, ksh ve zsh), bir dizgiyi bir kalıpla eşleştirmek için kullanılabilir. ( [Komutun yalnızca dizeleri eşitlik için test edebileceğini unutmayın .)
if [[ $PWD/ = /home/* ]]; then …
Geçerli dizinin altında olup olmadığını özellikle test ediyorsanız /home, sembolik bağlar nedeniyle basit bir alt dize testi yeterli değildir.
/homeKendi başına bir dosya sistemi varsa , geçerli dizinin ( .) o dosya sisteminde olup olmadığını sınayın .
if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
echo 'The current directory is on the /home filesystem'
fi
NetBSD, OpenBSD veya GNU'ya (örneğin Linux) readlinksahipseniz, readlink -fsembolik bağlantıları bir yoldan şeritlemek için kullanabilirsiniz .
case $(readlink -f .)/ in $(readlink -f /home)/*) …
Aksi takdirde, pwdgeçerli dizini göstermek için kullanabilirsiniz . Ancak, kabuğunuz cdkomutları izliyorsa ve dizine ulaşmak için kullandığınız adı “gerçek” konum yerine saklıyorsa, yerleşik bir kabuk kullanmamaya dikkat etmelisiniz .
case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
"$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) …
Ham versiyon:
[ ${PWD:0:6} = "/home/" ]
Dezavantajı var ki, önce karakterleri saymak zorunda, biri de /home/genel bir şeyle yerini alamaz $1.
edit (thanks @Michael) ile genelleme yapmak için karşılaştırma $VARyapabilir
[ "${PWD:0:${#VAR}}" = $VAR ]
${#var}uzunluğu nedir $var, yani genelleştirebilirsiniz[ "${PWD:0:${#1}}" = "$1" ]
Seni çok iyi soruyu anlamadım, ama üst öğesini bulmak için $ PWD , do dirname $PWD. Ebeveynin ebeveyni bulmak için koş dirname $(dirname $PWD)ve benzeri ...
/. Tamam, özyinelemeli kontrol edebilirim ama daha kolay bir şey yok mu?
Hm, [sınama STRING1 starts with STRING2koşulu seçeneği olmayan yazık .
Deneyebilirsiniz echo $PWD | grep '^$VAR', ancak VARözel semboller içerdiğinde ilginç şekillerde başarısız olabilir .
awk'nin indexişlevi hile yapabilmeli. Fakat bütün bunlar test etmek için bu kadar kolay bir şey için çok ağır görünüyor.
Yolun aranan kısmı bulunursa değişkeni "boşaltırım":
[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
[ "${PWD##$VAR}" != "$PWD" ]Ve eğer bu bir [code-golf] olsaydı ( stackoverflow.com/questions/tagged/code-golf)question beni iki karakterle yenin ;-) daha okunabilir ...