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 bashsö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 printfyerleş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, catkomutu 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 bashdüşü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 echobir 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 kshve çalışır zsh). Buna karşılık, bununla birlikte, dış echoyarar 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 bashve 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
===========]
-rreadbunun 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 readda 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 readkomuta 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.