Ö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 subdir
bir 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 case
yapı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.
/home
Kendi 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) readlink
sahipseniz, readlink -f
sembolik bağlantıları bir yoldan şeritlemek için kullanabilirsiniz .
case $(readlink -f .)/ in $(readlink -f /home)/*) …
Aksi takdirde, pwd
geçerli dizini göstermek için kullanabilirsiniz . Ancak, kabuğunuz cd
komutları 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 $VAR
yapabilir
[ "${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 STRING2
koş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 index
iş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 ...