2012-10-09 25 views
21

Ben kabuk komut dosyası için yeniyim. Birisi bana "\" ile alandan kaçmak için komuta yardım edebilir. Ben değişken FILE_PATH =/yol/zaman/metin dosyasına,
yalnız FILE_PATH boşluk kaçmak istiyorum zorunda =/yol/zaman/metin \ dosyasını \ olarakUnix komutu kaçış boşlukları

Ben tr -s komutuyla çalıştı

ama o

FILE_PATH = echo FILE_PATH | tr -s " " "\\ "

birileri doğru komutu önerebilir yardımcı doesnt !!

+0

Sahip olduğunuz ** gerçek ** sorun nedir? –

+0

Sadece cp, rm, vb gibi diğer komutlarda kullanabilmem için alandan kaçmak istiyorum. – Mojoy

+5

FILE_PATH öğesini diğer komutlarda kullanmak isterseniz, sadece tırnak işaretlerini kullanın. rm "$ FILE_PATH", boşluk içeriyorsa iyi çalışır. –

cevap

8

sadece kaçan alanlarda daha dize güvenli hale getirmek için daha çok var, ancak boşlukların kaçabilir: Sen sed ile yapabilirsiniz

FILE_PATH=$(echo "$FILE_PATH" | sed 's/ /\\ /g') 
+0

Detaylandırır mısınız? Kabuk tarafından ayrılan karakterlerin ortadan kaldırılmasını öneriyoruz, örneğin, [[() {}; '' [[space:] & 'yazdırılamaz karakterlerin yanı sıra aklınızda başka bir şey var mı? –

+0

@Barton Kesinlikle kullanımınıza bağlı olacak, ancak bahsettiğiniz karakterlerin tümü şüpheli. akıl, herhangi bir koruma türü için karakterlerden kaçmaya çalışmak kırılgandır ve çok dikkatli olmaksızın yapılması gereken bir şey değildir. –

1

:

NEW_FILE_PATH="$(echo $FILE_PATH | sed 's/ /\\ /g')" 
+0

'FILE_PATH = $ (echo $ FILE_PATH | sed" s// \\\/g ")' Üç ters eğik çizgi gerekir; çünkü hem kabukta hem de sed olarak ters eğik çizgi karakterinden kaçmanız gerekir. – sevcsik

-3
FILE_PATH=/path/to my/text file 
FILE_PATH=echo FILE_PATH | tr -s " " "\\ " 

Bu ikinci satırın,

FILE_PATH=echo $FILE_PATH | tr -s " " "\\ " 
012 olması gerekir. ama bence önemli değil. Bu aşamaya geldiğinizde, çok geç kaldınız. Değişken ayarlandı ve boşluklar kaçtı ya da değişken yanlış.

FILE_PATH = '/ yol/zaman/metin dosyasına'

+0

'FILE_PATH = echo $ FILE_PATH | tr -s "" "\\" 'bozuk. İhtiyacınız olan $() ' –

+0

Yeterince adil - Hızlı bir şekilde yazıyordum - ama bu birincil nokta değildi. – hymie

+0

Ayrıca, 'tr' bunun için kullanılamaz. –

30

Eğer bash kullanıyorsanız, onun yerleşik printf en% q biçimlendirici (bash tip help printf) kullanabilirsiniz:

FILENAME=$(printf %q "$FILENAME") 

Bu sadece boşluk değil, aynı zamanda kabuk için tüm özel karakterleri de belirtecektir. Senaryoya

cp '/path/with spaces/file.txt' '/another/spacey path/dir'

grep foo '/my/super spacey/path with spaces/folder/*'

ve:

#!/bin/bash 

spacey_dir='My Documents' 
spacey_file='Hello World.txt' 
mkdir '$spacey_dir' 
touch '${spacey_dir}/${spacey_file}' 
+0

Bunu kullanarak hala iki bitiştirme alanıyla ilgili sorun yaşıyorum. Ne yapabilirim? –

8

Boşluk içeren bir yolda çalışmasına 'tek tırnak kullanabilirsiniz SPACE karakterini koru

+2

Değişken enterpolasyon yapmanız gerekmiyorsa, aslında iki katı yerine tek tırnak kullanmayı öneririm. Bash, çift tırnak içinde enterpolasyon yapmaya çalışacak, ama tek değil gibi bazı sinsi karakterler var. Tabii ki, Bang karakterlerini dosya isimlerine koyan herkese bir çiçeği sokmaktasınız. –