2011-10-11 30 views
31

Bir bash komut böyle uzun bir komutu gömmek istiyorum: kırılmış uzun dosya adıBaşhktaki son derece uzun bir dizgeyi nasıl ayırabilirim?

mycommand \ 
    --server myserver \ 
    --filename extremely/long/file/name/that/i/would/like/to/be/able/to/break/up/if/possible \ 
    --otherflag \ 
    --anotherflag 

.

# Insufficiently pretty 
mycommand \ 
    --server myserver \ 
    --filename extremely/long/file/name/\ 
that/i/would/like/to/be/able/to/break/\ 
up/if/possible \ 
    --otherflag \ 
    --anotherflag \ 

ama akışını keser:

ben bunu. Ben gibi bu yazabilmek için olacaktır:

# Doesn't work 
mycommand \ 
    --server myserver \ 
    --filename extremely/long/file/name/\ 
     that/i/would/like/to/be/able/to/break/\ 
     up/if/possible \ 
    --otherflag \ 
    --anotherflag 

ama edebi dize kırılır çünkü çalışmıyor.

bir dize kırmak ancak herhangi gelen boşluklar görmezden bash anlamanın bir yolu var mı?

cevap

36

Bir değişkeni kullanabilirsiniz:

file=extremely/long/file/name 
file+=/that/i/would/like/to/be/able/to/break 
file+=/up/if/possible 

mycommand\ 
    --server myserver\ 
    --filename $file\ 
    --flag flag 
+6

İyi fikir. Bununla birlikte, + + 'yerine' file = $ {file}/... ' – Chriszuma

+5

+1 kullanarak temizleyebilirsiniz. Bu benim düşünceme göre en az gizlenen yaklaşımdır. Amaç açıktır. –

+0

@Chriszuma Evet, bash'ın '+ =' operatörüne izin verdiğini unuttum. Cevabımı düzenledim. – WilQu

36

Bir hack bir biraz, ama bu işleri:

mycommand \ 
    --server myserver \ 
    --filename "extremely/long/file/name/"` 
       `"that/i/would/like/to/be/able/to/break/"` 
       `"up/if/possible" \ 
    --otherflag \ 
    --anotherflag 

Bash bitişik dize hazır birleştirir, bu yüzden bu avantajı. Örneğin, echo "hi" "there"hi there yazdırırken echo "hi""there"hithere yazdırır.

Ayrıca işleci yararlanır ve boşluklar bir demet hiçbir şey değerlendirir gerçeği.

+2

yerine '\' hat continustion arasında açılmasını '\' 'önceki satırın sonunda koyabilirsiniz ... bundan hakkında düşünmüyordu, sol kenarı temiz –

+0

İyi çağrıyı tutar. Tamamen düzenlenmiş. – Chriszuma

1

Temelde, bunu yapmak için bash yerleşik bir şey yoktur.
Bir sarıcı genellikle değerinden daha büyük bir sıkıntıdır, ancak bir takma ad veya bir funciton deneyebilirsiniz, örneğin.

j(){sed -e ':a;$!N;s/ *\n *//g;ta' <<<"$1"} 

echo "$(j "3 spaces 
      /hello 
      /world 
      /this 
      /is 
      /a 
      /long 
      /path 
      ")" 

# 3 spaces/hello/world/this/is/a/long/path 
3

j benim bash komut dosyası üstündeki kısa strcat işlevi tanımlayın ve şeyleri bölmek bir satır içi çağırmayı kullanın. Bazen ayrı bir değişkeni kullanmayı tercih ederim, çünkü komut satırındaki uzun değişmezi in-line olarak tanımlayabilirim.

function strcat() { 
    local IFS="" 
    echo -n "$*" 
} 

mycommand \ 
    --server myserver \ 
    --filename "$(strcat \ 
     extremely/long/file/name/ \ 
     that/i/would/like/to/be/able/to/break/ \ 
     up/if/possible)" \ 
    --otherflag \ 
    --anotherflag \ 

Ben de ben değerleri arasındaki virgül yazarak önlemek için kullanabilirsiniz çünkü bir bayrak parametresi olarak bir değerler uzun CSV girmek zorunda bu yaklaşım gibi:

function strjoin() { 
    local IFS="$1" 
    shift 
    echo -n "$*" 
} 

csv_args=(
    foo=hello 
    bar=world 
    "this=arg has spaces in it" 
) 
mycommand \ 
    --server myserver \ 
    --csv_args "$(strjoin , "${csv_args[@]}")" \ 
    --otherflag \ 
    --anotherflag \ 

eşdeğerdir

için
mycommand \ 
    --server myserver \ 
    --csv_args "foo=hello,bar=world,this=arg has spaces in it" \ 
    --otherflag \ 
    --anotherflag \ 
1

bir de değişken bir dizi kullanabilir

file=(extremely/long/file/name 
    /that/i/would/like/to/be/able/to/break 
    /up/if/possible) 
IFS='' 

echo mycommand\ 
    --server myserver\ 
    --filename "${file[*]}"\ 
    --flag flag 
İlgili konular