2016-04-07 26 views
3

aracılığıyla Bir bash komut dosyasında bir dosyada başka bir dizeyle boşlukları olan bir dizeyi değiştirmeniz gerekir; burada tüm çağrılar komutu yazan bir işlev aracılığıyla yapılmalıdır bir günlük dosyasına ve sonra komutu çalıştırır. Logrun işlevi, komutta okumak için özel karakter [email protected] kullanır. Değiştirmek için sed kullanıyorum ama ifade parametresindeki boşluklara sahip sed komutu [email protected]'dan geçtiğinde boşluklardan kurtulmanın bir yolunu bulamıyorum.

ben a b c ile cdeğiştirilmesi için sed kullanmak komut test etmek için sorunu kolaylaştırmıştır. inşaat büyük test1.sh

:

#!/bin/bash 

TESTFILE=/tmp/test.txt 
echo "a c" > $TESTFILE 
sed -i -e 's/a c/a b c/' $TESTFILE 

test2.sh başarısız:

#!/bin/bash 

function logrun() { 
    [email protected] 
    $CMD 
} 

TESTFILE=/tmp/test.txt 
echo "a c" > $TESTFILE 
logrun sed -i -e 's/a c/a b c/' $TESTFILE 

Sonuç: Hatanın nedeni, uzay (ler) de olduğu

sed: -e expression #1, char 3: unterminated `s' command 

-e ifadesi. Bu işlevle sed çağırmak için bir yol bulamadım. Tek tırnak yerine çift tırnak kullanmayı ve ters eğik çizgi vb. Boşluklardan kaçmayı denedim. Bunu yapmak için doğru yolun ne olduğunu bulmak beni çok merak ediyor.

+3

@Barmar Sen kapattığınız birkaç soru: // stackoverflow. com/sorular/13365553/ayar-an-argüman-ile-bash. Daha kanonik bir kopya bulmak güzel olurdu. Bu sorunun, özellikle de bu yazıya hiç de değinmeyen $ @ 'ile ilgili sorduğu bir kişi için ayrıştırılması biraz zor. –

+0

Bir noktada dediniz, ve kaldırıldığından beri, "** Not: ** logrun işlevini değiştirmem gerekiyor.", Bu nedenle işlevi değiştirmek tamam mı? – user3439894

+0

@ user3439894 İşlevi değiştirmeden yapabilir misiniz? Bunun mümkün olup olmadığını bilmek isterim. – talamaki

cevap

4
logrun() { 
    CMD=("[email protected]") 
    "${CMD[@]}" 
} 

tırnaklar olmadan [email protected] Yazma tek boşlukla ayrılmış dizeye argümanların hepsi bir araya getirir. Alıntılar ile "[email protected]" her argümanı ayrı tutar ve boşlukları korur.

Sadece CMD="[email protected]" yazmak basit bir dize değişkeni oluşturur. CMD=("[email protected]") bir dizi oluşturur. Ardından, diziyi genişletmek için PARAMS: "${CMD[@]}" ile aynı sözdizimini kullanın. Tırnaklar ve iki takım parantez hepsi gereklidir. Hiçbirini dışarıda bırakma. Eğer CMD değişken gerekmiyorsa arada

, bu çok daha az ayrıntılı olabilir: http tekrarı olarak

logrun() { 
    "[email protected]" 
} 
İlgili konular