dizin yolu son eğik çizgi nasıl?


17

Bir bağımsız değişken olarak bir dizin gerektiren bir komut dosyası var. İki formu desteklemek istiyorum: biri şu şekildedir

a/b/c

(sonunda eğik çizgi yok) ve diğeri gibi

 a/b/c/

(sonunda eğik çizgi vardır).

Benim sorum: iki formdan herhangi biri göz önüne alındığında, ilk formu nasıl değiştirebilirim ve ikinci formun son eğimini ilk forma dönüştürmek için nasıl kesebilirim.


2
Çok fazla bir sorun olması gerektiği için değil - başlangıçta herhangi bir yerde çift eğik çizgi tek bir eğik çizgiye eşdeğerdir, bu yüzden bunları kullanarak katılma konusunda endişelenmeyin /.
muru

@muru Bunu daha önce bilmiyordum :).
Yulong Ao


1
@muru Sondaki eğik çizgi, bir sembolik bağ üzerinde işlem yapmak ve işaret ettiği dizine göre hareket etmek veya kaynak argümanı gibi bir fark yaratabilir rsync.
Gilles 'SO- kötü olmayı kes'

@Gilles gerçekten, ama gördüğünüz gibi, yollara katılmaktan bahsediyorum.
muru

Yanıtlar:


23
dir=${1%/}

komut dosyasının ilk parametresini alır ve varsa eğik çizgiyi kaldırır.


12

Eğer varsa bir eğik çizgiyi kaldırmak için , tüm POSIX stili kabuklarda bulunan sonek kaldırma parametresi genişletme yapısını kullanabilirsiniz :

x=${x%/}

Birkaç komplikasyon var. Bu yalnızca tek bir eğik çizgiyi kaldırır, bu nedenle işe başlarsanız a/b/c//yine de bir eğik çizgiyle karşılaşırsınız. Ayrıca, orijinal yol ise /, eğik çizgiyi korumanız gerekir. İşte bu durumlarla ilgilenen daha karmaşık bir çözüm:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

Alternatif olarak, ksh veya bash'dan sonra shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

Çoğu durumda, bir eğik çizgi olması önemli değildir. Argümanın bir dizine sembolik bir bağlantı olması önemlidir: sondaki eğik çizgi ile, argüman dizini belirtirken, izleyen eğik çizgi olmadan argüman sembolik bağın kendisini belirtir. Birkaç başka programla da önemlidir, örneğin, kaynak argümanı rsync, bir eğik çizginin varlığına bağlı olarak farklı şekilde ele alınır.


2

realpathverilen yolu çözer. Diğer şeylerin yanı sıra sondaki eğik çizgileri de kaldırır. -sAşağıdaki uyduları önlemek için kullanın

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.