BASH, diziyi nl_012_ \ n sınırsız dizeye yazma


1

BASH GNU bash, sürüm 4.2.25 (1) - sürüm (x86_64-pc-linux-gnu) Ubuntu 12.04LTS altında çalışılıyor

Bir dizinin içeriğini yeni satırlarla sınırlandırılmış bir dizgeye yazmakta sorun yaşıyorum.

Bu girişi buldum ( bir bash dizi değişkenini newlines ile sınırlandırılmış bir dizgeye nasıl dönüştürebilirim? ), Bu da çözümün elde edileceği konusunda büyük umutlar verdi. Bu komut satırında mükemmel çalışıyor.

$ System=('s1' 's2' 's3' 's4 4 4')
$ var=$( IFS=$'\n'; echo "${System[*]}" )
$ echo -e $var
s1
s2
s3
s4 4 4

Fakat onu bir kütüphane içindeki bir fonksiyona sözlü olarak dahil ettiğimde, tam olarak kendi dizimin yaptığı şeyi yapıyor ve yazdırıyor ...

s1 s2 s3 s4 4 4

Komut satırında od için boru, '\ n' sınırlayıcısının kullanımını onaylar

$ echo -e $var | od -ab
0000000   s   1  nl   s   2  nl   s   3  nl   s   4  sp   4  sp   4  nl
        163 061 012 163 062 012 163 063 012 163 064 040 064 040 064 012
          s   1  \n   s   2  \n   s   3  \n   s   4       4       4  \n
0000020

İşlev içinde aynı ifadeler, '\ s' sınırlayıcı olarak bir boşluk bırakın

    0000000   s   1  sp   s   2  sp   s   3  sp   s   4  sp   4  sp   4  nl
            163 061 040 163 062 040 163 063 040 163 064 040 064 040 064 012
              s   1       s   2       s   3       s   4       4       4  \n
    0000020

Bu beni güdükledi. '\ N' sınırlayıcısının işlev içinde kullanımını nasıl zorlayabilirim?

Kullandığım, sunulan çözümü göstermek için SORU EKLENDİ. Komut satırında tırnaklar arasında fark yoktur (ki bu beni yanlış yönlendirir!); echo -e $ var veya echo -e "$ var" aşağıdaki gibi doğru çıktıyı verir.

s1
s2
s3
s4 4 4

Komut dosyasında, teklifler bir fark yaratır! Tırnak işaretleri olmadan sınırlayıcı alandır (sp / 040)

echo -e $var | od -abc
0000000   s   1  sp   s   2  sp   s   3  sp   s   4  sp   4  sp   4  nl
        163 061 040 163 062 040 163 063 040 163 064 040 064 040 064 012
          s   1       s   2       s   3       s   4       4       4  \n
0000020

Betik içinde alıntılarla sınırlayıcı newline (nl, 012, \ n).

echo -e "$var" | od -abc
0000000   s   1  nl   s   2  nl   s   3  nl   s   4  sp   4  sp   4  nl
        163 061 012 163 062 012 163 063 012 163 064 040 064 040 064 012
          s   1  \n   s   2  \n   s   3  \n   s   4       4       4  \n
0000020

Bu öğrenme deneyimi için teşekkürler ve komut satırının ve komut dosyasının neden farklı davrandığına ilişkin basit bir açıklama var mı?

Yanıtlar:


0

Değişkeni alıntılaman gerekiyor. Aksi takdirde, komut dosyası tarafından genişletilmiş ve geçirilir echoolarak s1 s2 s3 s4:

System=('s1' 's2' 's3' 's4 4 4')
var=$( IFS=$'\n'; echo "${System[*]}" )
echo -e "$var"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.