Ben yaparken
str="Hello World\n===========\n"
Ben de \n
çıktısını alıyorum . Yeni hatları nasıl alabilirim o zaman?
Ben yaparken
str="Hello World\n===========\n"
Ben de \n
çıktısını alıyorum . Yeni hatları nasıl alabilirim o zaman?
Yanıtlar:
Gelen bash
sözdizimi kullanabilirsiniz
str=$'Hello World\n===========\n'
A'dan önce gelen tek tırnaklar $
, dizelere kaçış dizileri eklenmesini sağlayan yeni bir sözdizimidir.
Ayrıca printf
yerleşik sonuç bir çıktının değişkene kaydedilmesini sağlar.
printf -v str 'Hello World\n===========\n'
Her iki çözüm de bir deniz kabuğu gerektirmez.
Aşağıda dizgeyi yazdırmanız gerekiyorsa, aşağıdaki örnekte olduğu gibi çift tırnak kullanmanız gerekir:
echo "$str"
çünkü dizeyi tırnak işaretleri olmadan yazdırdığınızda, newline boşluklara dönüştürülür.
str=$'Hello World\n===========\n'
Adı verilen sözdizimi nedir ? değişken ikame?
str=$"My $PET eats:\n$PET food"
? Bu yaklaşım çift tırnak için işe yarar
Kelimenin tam anlamıyla yeni satırları tek tırnak içine alabilirsiniz (herhangi bir Bourne / POSIX tarzı kabukta).
str='Hello World
===========
'
Çok satırlı bir dize için, burada belgeler genellikle uygundur. Dize bir komuta girdi olarak beslenir.
mycommand <<'EOF'
Hello World
===========
EOF
Dizeyi değişkende saklamak istiyorsanız, cat
komutu bir komut yerine kullanın. Dizenin sonundaki yeni satır karakterleri, komut yerine koyularak sıyrılacaktır. Son satırları saklamak istiyorsanız, sonuna bir durdurucu yerleştirin ve daha sonra soyun. POSIX uyumlu mermilerde str=$(cat <<'EOF'); str=${str%a}
heredoc'u uygun yazdıktan sonra yazabilirsiniz , ancak bash heredokun kapanış parantezinden önce görünmesini gerektirir.
str=$(cat <<'EOF'
Hello World
===========
a
EOF
); str=${str%a}
Ksh, bash ve zsh'da, $'…'
alıntılar içinde ters eğik çizgi kaçışlarını genişletmek için belirtilen formu kullanabilirsiniz .
str=$'Hello World\n===========\n'
str=$(cat <<'EOF')
olduğu gibi .. çalışmıyor )
sonu doc sonraki satırda yerleştirilecek ihtiyaçlarını EOF
.. ama buna rağmen, bu Komutanlığına bağlı sondaki yeni satır kaybeder İkame.
\n
örnekleri korumak için, durdurucu yaklaşımına bir alternatif olarak bash
düşünün IFS= read -r -d '' str <<'EOF'...
(cevabımı bakın).
"Eko" kullanıyor musunuz? "Echo-e" yi dene.
echo -e "Hello World\n===========\n"
echo
-n belirtmediğiniz sürece otomatik olarak bir tane ekleyecektir. (Bununla birlikte, sorunun asıl amacı, bu yeni satırları bir değişkene nasıl getireceğimizdir).
bash
, echo -e
yapar OS X üzerinde çalışmaya - bunun nedeni echo
bir bash olan yerleşik (ziyade harici çalıştırılabilir) ve bu yerleşik destekliyor -e
. (Bir yerleşik olarak, bash'ın çalıştığı tüm platformlarda echo -e
çalışmalıdır ; tesadüfen çalışır ksh
ve çalışır zsh
). Buna karşılık, bununla birlikte, dış echo
yarar OS X üzerinde - /bin/echo
- aslında yok değil desteklemek -e
.
Komut dosyanızda newline'lara birçok kez gereksinim duyarsanız, newline'ı tutan global bir değişken tanımlayabilirsiniz. Bu şekilde çift tırnaklı dizelerde (değişken açılımlar) kullanabilirsiniz.
NL=$'\n'
str="Hello World${NL} and here is a variable $PATH ===========${NL}"
$''
bir deniz kabuğu gerektiriyor?
"My dog eats:${NL}dog food"
Mevcut harika cevapları tamamlamak için:
Kullanıyorsanız bash
ve okunabilirlik için gerçek yeni satırları kullanmayı tercih ederseniz , burada bir dokümanı bir değişkende yakalamakread
için başka bir seçenektir (buradaki diğer çözümler gibi) bir alt kabuk kullanımı gerektirmez.
# Reads a here-doc, trimming leading and trailing whitespace.
# Use `IFS= read ...` to preserve it (the trailing \n, here).
read -r -d '' str <<'EOF' # Use `IFS= read ...` to preserve the trailing \n
Hello World
===========
EOF
# Test: output the variable enclosed in "[...]", to show the value's boundaries.
$ echo "$str"
[Hello World
===========]
-r
read
bunun girişi yorumlamamasını sağlar (varsayılan olarak ters eğik çizgilere özel davranır, ancak bu nadiren gereklidir).
-d ''
"kayıt" sınırlayıcısını boş bir dizeye ayarlar, bu read
da girişin tamamını aynı anda okumasına neden olur (sadece tek bir satır yerine).
$IFS
(İç alan ayırıcıyı) varsayılan değerinde $' \t\n'
(boşluk, sekme, yeni satır) bırakarak , öndeki ve sondaki boşlukların,$str
burada-doc'ın son satırını da içeren atanmış değerinden kesildiğini unutmayın.
(Burada-doktorun vücut hattı üzerinde başlar halde unutmayın sonra başlangıç sınırlayıcı ( 'EOF'
burada), bu yok değil işaretini içerir lider satırsonu).
Genellikle, bu istenen davranıştır, ancak yeni satır sondaki bunu istiyorum yoksa, kullanmak IFS= read -r -d ''
yerine sadece read -r -d ''
ama unutmayın herhangi baştaki ve sondaki boşluk sonra korunur.
( IFS=
Doğrudan read
komuta hazırlanmanın, atamanın yalnızca bu komut sırasında geçerli olduğu anlamına gelir, bu nedenle önceki değeri geri yüklemeye gerek yoktur.)
Bir here-doc kullanmak , isteğe bağlı olarak çok satırlı dizgiyi okunabilirlik için çıkarmak üzere girintiyi kullanmanızı sağlar :
# Caveat: indentation must be actual *tab* characters - spaces won't work.
read -r -d '' str <<-'EOF' # NOTE: Only works if the indentation uses actual tab (\t) chars.
Hello World
===========
EOF
# Output the variable enclosed in "[...]", to show the value's boundaries.
# Note how the leading tabs were stripped.
$ echo "$str"
[Hello World
===========]
Yerleştirme -
arasında <<
ve burada-doc açılış sınırlayıcı ( 'EOF'
burada) sekmesi karakterleri burada-doc beden ve hatta kapanış sınırlayıcı çıkarılmalı yol açan neden olur, ancak bu dikkat do yalnızca çalışır fiili sekme karakterleri , değil boşluklar, eğer öyleyse senin editör tab tuşlarını boşluklara çevirir, fazladan çalışmaya ihtiyaç vardır.
bu şekilde yapmanız gerekir:
STR=$(echo -ne "Hello World\n===========\n")
Güncelleme:
Fred'in işaret ettiği gibi, bu şekilde "\ n" izini kaybedersiniz. Ters eğik çizgi dizileri içeren değişken atamak için şunları yapın:
STR=$'Hello World\n===========\n\n'
hadi test edelim:
echo "[[$STR]]"
bize şimdi veriyor:
[[Hello World
===========
]]
Not $ '', $ "" den farklı. İkincisi, geçerli yerel ayarlara göre çeviri yapar. İlahiyat için, bkz man bash
.
#!/bin/bash
result=""
foo="FOO"
bar="BAR"
result+=$(printf '%s' "$foo")$'\n'
result+=$(printf '%s' "$bar")$'\n'
echo "$result"
printf '%s' "$result"
çıktı:
FOO
BAR
FOO
BAR
result+=$foo$'\n'
? eğer varsa $(printf %s "$foo")
sondaki yeni satır karakterlerini keserdi $foo
.