Senaryomda bir sorunum var echo:
echo -n "Some string..."
baskılar
-n Some string...
ve bir sonraki satıra geçiyor. Konsolda yeni satır olmadan doğru çalışıyor:
Some string...
echo -ne "text without new line: "; echo "some text";
Senaryomda bir sorunum var echo:
echo -n "Some string..."
baskılar
-n Some string...
ve bir sonraki satıra geçiyor. Konsolda yeni satır olmadan doğru çalışıyor:
Some string...
echo -ne "text without new line: "; echo "some text";
Yanıtlar:
echoKomutun farklı davranışlara sahip birden çok sürümü vardır . Görünüşe göre betiğiniz için kullanılan kabuk tanımayan bir sürümü kullanıyor -n.
printfKomut çok daha tutarlı bir davranış vardır. echogibi basit şeyler için iyidir echo hello, ancak printfdaha karmaşık bir şey için kullanmanızı öneririm .
Hangi sistemdesiniz ve betiğiniz hangi kabuğu kullanıyor?
#!/bin/bashçalıştı. Normalde bash ile çalışıyorum.
printfkomutun Windows sürümü vardır .
echoher zaman yeni satırlar ekler ... Geçici çözüm en iyi ihtimalle cenky.
%sizin kabuk isteminizdir. Bunu deneyin ve dikkatlice izleyin:printf hello; sleep 5
bash "echo" adında "yerleşik" bir komutu vardır:
$ type echo
echo is a shell builtin
Ek olarak, uygun bir çalıştırılabilir olan bir "echo" komutu vardır (yani, /bin/echoyorumlama echove yürütmenin aksine kabuk çatalları ve yürütmeler ):
$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21 2011 /bin/echo
echo'In WRT'sinin davranışı \cve -ndeğişkenliği değişir. En iyi bahsiniz, printfbaktığım dört farklı * NIX aromasında mevcut:
$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
İle deneyin
echo -e "Some string...\c"
Benim için beklendiği gibi çalışıyor (sorunuzdan anladığım gibi).
Bu bilgiyi mansayfadan aldığımı unutmayın . manSayfa aynı zamanda kabuk kendi sürümüne sahip olabilir notları echove eğer emin değilim bashkendi sürümü de vardır.
echo "some string...\c"bunun yerine söylemek istersiniz . Bununla birlikte, çılgınca farklı yankı komutları ile birden fazla bash varyantını desteklemeniz gerekiyorsa, muhtemelen printf kullanmaktan daha iyidir veya echo komutlarının yeteneklerini [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(en azından bash \ n \ c) de bir şeyle kontrol etmeniz gerekir , bu nedenle -n seçeneği, ama bash için -e'ye ihtiyacınız var)
Bunu başarmak için temel olarak sık kullandığım iki yöntem vardır:
1. ile imleç çıkış karakterini ( \c) kullanmaecho -e
Örnek :
for i in {0..10..2}; do
echo -e "$i \c"
done
# 0 2 4 6 8 10
-eflag , dizede E scape karakterlerini etkinleştirir . \cC imlecini geçerli satıra geri getirir .VEYA
2.printf Komutunu kullanma
Örnek :
for ((i = 0; i < 5; ++i)); do
printf "$i "
done
# 0 1 2 3 4
Bir if içinde "read" gibi diğer komutlarla yankı kullanırsanız, bu ayar dikkate alınmayabilir ve yine de yeni bir satıra atlayacaktır.
Sadece en popüler linux Ubuntu için bash:
Hangi kabuğu kullandığınızı kontrol edin? Çoğunlukla işlerin altında, başka görün :
echo $0
Yukarıdaki baskılar varsa bash, aşağıda çalışacaktır:
printf "hello with no new line printed at end"
VEYA
echo -n "hello with no new line printed at end"
Gittiğinizde kabuk komut dosyası yazdığınızda her zaman ilk satırı #! / Usr / bin / env bash olarak koyun. Bu kabuk, kaçış dizilerini atlamaz veya manipüle etmez. ex echo "Bu ilk \ n satırı" yazdırır Bu ilk \ n satırıdır.
enable -n echo
echo -n "Some string..."
bashbourne kabuk modunda koşarsam, burada iyi çalışır. Ayrıca, interaktif kabuğunuz olarak gerçekten bir bourne kabuğu kullanmanız pek olası değil, değil mi?