Bash'de şunu denedi:
echo -e "hello\nworld"
Ancak, yalnızca yeni bir satır yazdırmaz \n
. Yeni satırı yazdırmasını nasıl sağlayabilirim?
Ubuntu 11.04 kullanıyorum.
Bash'de şunu denedi:
echo -e "hello\nworld"
Ancak, yalnızca yeni bir satır yazdırmaz \n
. Yeni satırı yazdırmasını nasıl sağlayabilirim?
Ubuntu 11.04 kullanıyorum.
Yanıtlar:
Bunun printf
yerine şunları kullanabilirsiniz :
printf "hello\nworld\n"
printf
daha tutarlı davranışı vardır echo
. Davranışı echo
farklı sürümler arasında büyük farklılıklar gösterir.
printf %"s\n" hello world
çok fazla argüman verilirse printf formatı yeniden kullanacaktır
echo
desteklemek için uygunsa -e
.
echo
, -e
çıktıda sadece basılır, bu yüzden bu cevabın mükemmel bir şekilde geçerli olduğunu düşünüyorum çünkü echo
burada tutarlı değil (belirli bir sürümden bahsetmedikçe).
Bash'da olduğunuzdan emin misiniz? Benim için çalışıyor, dört yolun hepsi:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
-e
param tüm * nix OS'de yok
echo $'hello\nworld'
baskılar
hello
world
$''
dizelerde ANSI C Alıntı kullanılır :
Formdaki kelimeler özel olarak ele alınır. Sözcük dizeye genişler , ters eğik çizgiden kaçan karakterler ANSI C standardında belirtildiği gibi değiştirilir.
$'string'
Her zaman yapabilirsin echo ""
.
Örneğin
echo "Hello"
echo ""
echo "World"
echo ""
benim için çalışıyor ve bu doğrudan soruyu cevaplamasa bile, yeni bir satır yazdırmanın en basit formudur. Şerefe.
echo -en "\n"
.
echo
boş bir satır elde etmek için yeterli
Deneyin
echo -e "hello\nworld"
hello
world
nano
editörde benim için çalıştı .
Man sayfasından:
-e
ters eğik çizgi kaçışlarının yorumlanmasını etkinleştir
Birisinin bir iş arkadaşının senaryosunun neden yeni satırlar yazdırmayacağını anlamaya çalışırken başını duvara dövdüğünü fark etmesi durumunda, buna dikkat edin ->
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
echo $(GET_RECORDS);
Yukarıda olduğu gibi, yöntemin fiili çalışması, yöntemin kendisinde olabilecek herhangi bir yankının yerine geçen bir ekoya sarılabilir. Açıkçası bunu kısalık için suladım, fark etmek o kadar kolay değildi!
Daha sonra yoldaşlarınıza işlevleri yürütmenin daha iyi bir yolunun şöyle olacağını bildirebilirsiniz:
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
GET_RECORDS;
Eko üzerinde POSIX 7
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
tanımlanmamıştır ve ters eğik çizgiler uygulama olarak tanımlanmıştır:
İlk işlenen -n ise veya işlenenlerden herhangi biri <backslash> karakteri içeriyorsa, sonuçlar uygulama tanımlıdır.
isteğe bağlı bir XSI uzantınız yoksa.
Bu yüzden printf
iyi belirlenmiş yerine, kullanmanızı öneririz :
biçim işlenen XBD Dosya Biçimi Gösterimi [...] 'de açıklanan biçim dizesi olarak kullanılacaktır
\ n <newline> Baskı konumunu sonraki satırın başına götür.
Ayrıca Ubuntu 15.10 ve dağıtımların çoğunun şu şekilde uygulandığını unutmayın echo
:
help echo
which echo
bazı karışıklıklara yol açabilir.
Basitçe yazın
echo
yeni bir hat almak
str='hello\nworld'
$ echo | sed "i$str"
hello
world
CentOS'ta benim için çalışıyor:
echo -e ""hello\nworld""
Ayrıca şunları da yapabilirsiniz:
echo "hello
world"
Bu hem bir komut dosyasının içinde hem de komut satırından çalışır.
Komut satırında, dizenin içindeki satır sonlarını yapmak için Shift+ tuşuna basın Enter.
Bu benim macOS ve Ubuntu 18.04 benim için çalışıyor
Bu çözümlerden herhangi biriyle çalışmayan ve işlevlerinden bir dönüş değeri alması gerekenler için buraya bir giriş daha:
function foo()
{
local v="Dimi";
local s="";
.....
s+="Some message here $v $1\n"
.....
echo $s
}
r=$(foo "my message");
echo -e $r;
Sadece bu hile bu bash ile üzerinde çalıştığım bir linux'da çalıştı:
GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
Umarım benzer problemi olan birine yardımcı olur.
Senaryom:
echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings
Çıktı:
WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:
Benim bash senaryomda, sadece denemeden önce senin gibi deliriyordum:
echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"
Sadece atlamayı eklemek istediğiniz enter tuşuna basın. Çıktı şimdi:
WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
Yankıyı parantez ile de kullanabilirsiniz,
$ (echo hello; echo world)
hello
world
echo hello; echo world
Bu daha iyi yapılabilir
x="\n"
echo -ne $x
-e seçeneği kaçış dizisi için ters anahtarları yorumlar
-n seçeneği çıktıdaki sondaki yeni satırı kaldırır
PS: echo komutunun çıktıya her zaman bir satırsonu karakteri ekleme etkisi vardır, bu yüzden -n bu şeyi kapatmak (ve daha az kafa karıştırıcı) yapmak için gereklidir
Bir yoktur yeni parametre genişleme ilave bash 4.4
olduğunu yorumlayıp kaçış dizileri:
${parameter@operator} - E operator
Genişletme,
$'…'
tırnak işareti mekanizmasında olduğu gibi genişletilen ters eğik çizgi kaçış dizileriyle parametre değeri olan bir dizedir .
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Komut dosyaları yazıyorsanız ve yeni satırları diğer iletilerin bir parçası olarak birkaç kez yankılayacaksanız, hoş bir çapraz platform çözümü, aşağıdaki gibi bir değişkene gerçek bir satırsonu koymaktır:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
Bazen bir boşlukla ayrılmış birden fazla dize geçirebilirsiniz ve bu dizge olarak yorumlanır \n
.
Örneğin, çok satırlı bildirimler için kabuk komut dosyası kullanırken:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
\n
. Program için ayrı bir argüman olarak yorumlanır ve programın kendisi bu argümanı yeni bir satırda görüntüleyebilir, ancak bu \n
herhangi bir noktada dönüştürüldüğü ve tamamen programa bağımlı olduğu anlamına gelmez .
Bu beni oraya getirdi ....
outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff
Verim:
RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]
Ek çözüm:
Durumlarda, uzun içeriğin çok satırlı yankısını yazmanız gerekir (kod / yapılandırma gibi)
Örneğin :
echo -e
,
printf
bazı sınırlamaları olabilir
Bazı özel karakterleri yer tutucu olarak satır sonu (örneğin ~
) olarak kullanabilir ve dosya kullanılarak oluşturulduktan sonra değiştirebilirsiniz.tr
echo ${content} | tr '~' '\n' > $targetFile
tr
IMO olması gereken başka bir program ( ) çağırması gerekir.