Kaynak kod içindeki read -p komut isteminde uzun bir dizeyi birden çok satıra nasıl bölebilirim?


19

Olarak çalıştırılacak bir yükleme komut dosyası yazıyorum /bin/sh.

Bir dosya isteyen bir satır var:

read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY

Bu uzun satırı birçok satıra bölmek istiyorum, böylece hiçbiri 80 karakteri geçemez. Ben komut dosyasının kaynak kodundaki satırlar hakkında konuşuyorum ; komut dosyası yürütüldüğünde ekranda yazdırılacak satırlar hakkında değil !

Ne denedim:

  • Frist yaklaşımı:

    read -p "goat can try change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] " REPLY

    Bu yazdırılmadığından çalışmaz Would you like to add this feature? [Y|n].

  • İkinci yaklaşım:

    echo "goat can try change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] "
    read REPLY

    İyi çalışmıyor. Bilgi isteminden sonra yeni satır yazdırır. İçin -nseçenek eklemek echoyardımcı olmaz: sadece yazdırır:

    -n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n]
    # empty line here
  • Mevcut geçici çözümüm

    printf '%s %s ' \
        "goat can try change directory if cd fails to do so." \
        "Would you like to add this feature? [Y|n] "
    read REPLY

ve daha iyi bir yol olup olmadığını merak ediyorum.

Unutmayın ki /bin/shuyumlu bir çözüm arıyorum .


1
Ben 1. daha geniş bir terminal ve / veya editör penceresi kullanmanızı öneririz (örneğin, 1440p monitörde 192 sütun 51 satır terminal kullanıyorum - günlük dosyalarını kuyruklamak ve vim'de kaynak kodunu düzenlemek için harika) ve 2. Aslında kaynak kod satırları 80 karakterden daha uzun olacaktır - bu kaçınılmazdır. Daha küçük bir yazı tipi kullansaydım, daha geniş bir terminale sahip olabilirdim, ancak mevcut kurulumum genişlik ve okunabilirlik arasında iyi bir uzlaşma.
cas

Yanıtlar:


17

Her şeyden önce, bir değişken kullanarak metin satırındaki okumayı ayıralım:

text="line-1 line-2"             ### Just an example.
read -p "$text" REPLY

Bu şekilde sorun şöyle olur: Bir değişkene iki satır nasıl atanır.

Tabii ki, bunu yapmaya yönelik ilk girişim:

a="line-1 \
line-2"

Bu şekilde yazılan var aaslında değeri alır line-1 line-2.

Ama bunun yarattığı girinti eksikliğinden hoşlanmıyorsunuz, o zaman satırları burada-doc'den varya okumaya çalışabiliriz (burada-doc içindeki girintili satırların boşluk değil, bir sekmeye ihtiyacı olduğunu unutmayın, düzgün çalışmak için):

    a="$(cat <<-_set_a_variable_
        line-1
        line-2
        _set_a_variable_
    )"
echo "test1 <$a>"

Ama bu aslında iki satır yazıldığında başarısız olur $a. Yalnızca bir satır almak için bir geçici çözüm şunlar olabilir:

    a="$( echo $(cat <<-_set_a_variable_
        line 1
        line 2
        _set_a_variable_
        ) )"
echo "test2 <$a>"

Bu yakın, ancak başka ek sorunlar yaratıyor.

Doğru çözüm.

Yukarıdaki tüm girişimler bu sorunu olması gerektiği kadar karmaşık hale getirecektir.

Çok temel ve basit bir yaklaşım:

a="line-1"
a="$a line-2"
read -p "$a" REPLY

Özel örneğinizin kodu ( readdestekleri olan herhangi bir kabuk için -p):

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        read -p "$a" REPLY

Diğer tüm mermiler için:

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        printf '%s' "$a"; read REPLY

@BinaryZebra biliyorum. Ben sadece "herhangi bir kabuk için" düzelttim çünkü tüm kabukları okumadı ve -p olanları değil.
terdon

@terdon İkimiz de aynı fikirde. Teşekkür sebebi :-). Tekrar teşekkürler.

1

Satırların sonundaki ters eğik çizgi, komutun çıktıdaki gerçek satır kesmelerine değil, birden çok satırda devam etmesine izin veriyor.

Yani ilk yaklaşımınız, örneğin,

read -p "goat can try change directory if cd fails to do so. " "Would you like to add this feature? [Y|n] " REPLY

Neden birden fazla satır çıktısını okumak istediğinizden emin değilim, ancak readbilgi istemi satırı ve echoönceki satır (lar) için kullanacağım .

Kodu birden çok satırda daha okunabilir hale getirmek için satırlar arasındaki tırnak işaretlerini kapatmayın / açmayın.

Bunu dene:

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

İki satır yazdırmasını istemiyorum! Kodun komut dosyasının kaynak kodunda satır başına 80 karakter sığmasını istiyorum ! Yine de cevabınız için teşekkürler :)
Mateusz Piotrowski

Önerdiğiniz yaklaşımı sevmiyorum çünkü girinti yok. Eğer readbir fonksiyonun içine girintiliyse, yaklaşımınız okunabilirliği bozuyor gibi görünüyor.
Mateusz Piotrowski

1

@ BinaryZebra'nın yaklaşımını daha temiz olması için bir değişken kullanarak buluyorum , ancak bunu denediğiniz şekilde de yapabilirsiniz. Satır sonlarını tırnak içinde tutmanız yeterlidir:

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

Her satırdan sonra yeni satırlar eklemenin okunabilirliği artıracağını düşünüyor musunuz? Çünkü istemime eklemenin yolunu aramıyordum \n. Her satır en fazla 80 karakter uzunluğunda olacak şekilde kodu birden çok satıra bölmek istedim .
Mateusz Piotrowski

1
@MateuszPiotrowski oh, bu çok daha mantıklı. O zaman cevabım çok kullanışlı değil. Lütfen sorunuzu düzenleyin ve çıktıyı değil kodu bölmek istediğinizi açıklayın. Şimdi cep telefonuyum ama yarın bir şey bulabilecek miyim.
terdon

1
@MateuszPiotrowski yaptı, başlangıçta denediğinizin çalışan bir versiyonunu ekledim.
terdon

0

Sadece buna ne dersiniz:

#! / Bin / bash
read -p "Merhaba
Dünya
bu bir
çok hatlı
komut istemi: "İSTEM
echo $ PROMPT


Nasıl girintilersiniz?
Mateusz Piotrowski
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.