Varsayılan değeri olan bash değişkenini okuma


191

Bir bash komut dosyasında terminalden bir değer okumak gerekiyor. Kullanıcının değiştirebileceği varsayılan bir değer sağlayabilmek istiyorum.

# Please enter your name: Ricardo^

Bu komut dosyasında "Lütfen adınızı girin:" istemi varsayılan değer "Ricardo" dur ve imleç varsayılan değerden sonra olacaktır. Bunu bir bash betiğinde yapmanın bir yolu var mı?

Yanıtlar:


280

Kullanabileceğiniz parametre genişletme örneğin

read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name

Parantez içindeki bilgi istemine varsayılan değeri dahil etmek oldukça yaygın bir kuraldır


7
Sonunda buna dayalı bir şey yaptım. Temp değişkenine okuma inputve kullanma name=${input:-$name}.
Ricardo Marimon

41
Bu aslında soruyu cevaplamıyor. Varsayılan değer bilgi isteminde görüntülenmelidir.
Dr. Kişi Kişi II

3
ve ne name=${!input:-$name}yapacaksın?
Harry Lee

8
@ Dr.PersonPersonII - böyle bir şey yaparak varsayılan değeri ekleyebilirsiniz: read -p "Uzak ana bilgisayar adını girin [$ remote_host_default]:" remote_host remote_host = $ {remote_host: - $ remote_host_default}
Dobler

4
$1olur${1:-some_default_string}
ThorSummoner

160
read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME

1
Mükemmel cevap! Ben sadece onunla sorun yaşadığımı belirtmek istiyorum, çünkü "Ricardo" ve NAME arasındaki boşluğu görmedim, ama bir kez bunu anladım ... büyü ! Teşekkür ederim!
Bay Mikkél

40
maalesef -i OSX 10.7 için geçerli bir seçenek değil mi
tanımsız

3
@BrianMortenson Bash'i homebrew kullanarak yükseltebilirsiniz: stackoverflow.com/questions/16416195/…
antonagestam

2
Bu yanıt, OS X (Bash 3.x) üzerinde nasıl çalışılacağını gösterir: stackoverflow.com/questions/22634065/…
Christoph Petschnig

3
Sadece çalışmasına -eizin vermek -iiçin zorunlu görünüyor unutmayın
MestreLion

48

Bash 4'te:

name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"

Bu, aşağıdaki istemden sonra adı görüntüler:

Please enter your name: Ricardo

imleç adın sonunda olacak ve kullanıcının onu düzenlemesine izin verecektir. Son satır isteğe bağlıdır ve kullanıcı girişi veya varsayılanı silerse (boş bir değer gönderirse) adı orijinal varsayılan olmaya zorlar.


Debian dağıtımlarında standart olmadığı için bash4 kullanılamaz. Fazla uğraşmadan çalışacak bir şeye ihtiyacım var.
Ricardo Marimon

1
Hiçbir kod son satırında ihtiyacı, sadece kullanmak nameyerine inputde readkomuta.
RNA

1
@RNAer: Ekstra değişken kullanılarak, $namekullanıcı önerilen değeri silerse (ve böylece bir boş dize girerse) değeri korunur. Her şey ihtiyacınızın ne olduğuna bağlı. Cevabımda çok şey söyledim. Yine de, daha açık olabileceğimi ve isteğe bağlı satır kullanılmazsa, değişkenin olabileceğini söylemiştiniz name.
sonraki duyuruya kadar duraklatıldı.

1
@DennisWilliamson: Haklısın. Eğer isterse bu iyi bir uygulamadır.
RNA

16

Kod:

IN_PATH_DEFAULT="/tmp/input.txt"
read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"

OUT_PATH_DEFAULT="/tmp/output.txt"
read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"

echo "Input: $IN_PATH Output: $OUT_PATH"

Örnek çalışma:

Please enter IN_PATH [/tmp/input.txt]: 
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt

Bunu beğendim çünkü varsayılan değerin iki nokta üst üste köşeli parantez içinde olduğu birçok kabuk komut dosyasında gördüğüm kurallara uyuyor. Teşekkürler!!!
morfatik

16

Bu soruyu buldum, şöyle bir şey sunmanın bir yolunu arıyorum:

Something interesting happened.  Proceed [Y/n/q]:

Yukarıdaki örnekleri kullanarak bunu çıkarım: -

echo -n "Something interesting happened.  "
DEFAULT="y"
read -e -p "Proceed [Y/n/q]:" PROCEED
# adopt the default, if 'enter' given
PROCEED="${PROCEED:-${DEFAULT}}"
# change to lower case to simplify following if
PROCEED="${PROCEED,,}"
# condition for specific letter
if [ "${PROCEED}" == "q" ] ; then
  echo "Quitting"
  exit
# condition for non specific letter (ie anything other than q/y)
# if you want to have the active 'y' code in the last section
elif [ "${PROCEED}" != "y" ] ; then
  echo "Not Proceeding"
else
  echo "Proceeding"
  # do proceeding code in here
fi

Aynı problemle karşılaşırlarsa, birisinin mantığı düşünmesine gerek kalmamasına yardımcı olan umarım


Çok hoş. Birisi sadece "k" ya da verilen seçimlerden başka bir şey girerse, soruyu tekrarlamak biraz daha geliştirilebilir.
erikbwork

1
Bu yorumu çizik bir kaşıntıdan sonra yazdım. Şimdi yukarıdakileri içeren bir kabuk fonksiyonum var ve bunu kullanma eğilimindeyim. Shell güzel bir döngü gibi görünmüyor, bu yüzden bundan kaçınmaya çalışıyorum. Sonucu benim işlev test ve bir daha deneyin, ama temelde, şeyler yanlış gidebilir nerede yönetici araçları yazıyorum, bu yüzden yönetici herhangi bir noktada komut dosyası temiz durdurmak mümkün istiyorum.
sibaz

11

Ben sadece tercih ettiğim bu deseni kullandım:

read name || name='(nobody)'

6
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname

Varsayılanı ayarlayın; yazdır; yeni bir değer okumak; yeni bir değer varsa, bunu varsayılanın yerine kullanın. Bir komut satırının sonunda bir satırsonunun nasıl bastırılacağı konusunda mermiler ve sistemler arasında bazı farklılıklar vardır (ya da vardır). '\ C' gösterimi MacOS X 10.6.3 üzerinde 3.x bash ile çalışıyor ve Bourne veya Korn kabuklarını kullanarak System V'den türetilen Unix'in çoğu varyantında çalışıyor.

Ayrıca kullanıcının muhtemelen perde arkasında neler olup bittiğini fark etmeyeceğini unutmayın; yeni verileri ekranda zaten görünen addan sonra girilir. Biçimlendirmek daha iyi olabilir:

echo "Please enter your name ($name): \c"

printfdaha taşınabilirecho
ghostdog74

3
@ ghostdog74: belki öyle; 25 yıl önce kabuk programlamayı öğrenen bizler, hangi uygulamalarımızın hala geçerli olduğunu anlamakta zorlanıyoruz. Giderek bash hemen her şeyi yeniden yazmış gibi görünüyor. Printf'in komut olarak bir süredir var olduğunu biliyorum - Çok nadiren kullanıyorum, ama (muhtemelen - asla?). Ben bash'ı öğrenene kadar mermiyi kapamam gerektiği izlenimini edinirim. 'Bu komik; üzerinde çalıştığım yazılımın iyi çalışmayan kabuk betikleri var - ama sorun bash-isms değil. Sadece ' if (test -z "$xxx"); ...' ve diğer C kabukluklarını tamir etmekten bıktım.
Jonathan Leffler

Bu bash desteklerine hayran kaldım \c, çünkü aynı zamanda destekliyor echo -n! Ancak, -ekaçışları yorumlamak için bash'ın yankısını almak için eklemeniz gerekir. Sanırım \csöylenmemiş şeyler için:echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
jpaugh

1
#Script for calculating various values in MB
echo "Please enter some input: "
read input_variable
echo $input_variable | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'

3
lütfen cevabınıza açıklama ekleyiniz.
Sufiyan Ghori

-1

-E ve -t parametresi birlikte çalışmaz. bazı ifadeler denedim ve sonuç aşağıdaki kod pasajı oldu:

QMESSAGE="SHOULD I DO YES OR NO"
YMESSAGE="I DO"
NMESSAGE="I DO NOT"
FMESSAGE="PLEASE ENTER Y or N"
COUNTDOWN=2
DEFAULTVALUE=n
#----------------------------------------------------------------#
function REQUEST ()
{
read -n1 -t$COUNTDOWN -p "$QMESSAGE ? Y/N " INPUT
    INPUT=${INPUT:-$DEFAULTVALUE}
    if  [ "$INPUT" = "y" -o "$INPUT" = "Y" ] ;then
        echo -e "\n$YMESSAGE\n"
        #COMMANDEXECUTION
    elif    [ "$INPUT" = "n" -o "$INPUT" = "N" ] ;then
        echo -e "\n$NMESSAGE\n"
        #COMMANDEXECUTION
    else
        echo -e "\n$FMESSAGE\n"
    REQUEST
    fi
}
REQUEST

Cevabınızın soru ile ilgisi yok, değil mi?…
gniourf_gniourf

-e ve -t parametresini kullanmak için bir çözüm. bu kod çizgisi (varsayılan değer için -e ve -i): -e -p "Adınızı Girin:" -i "Ricardo" NAME bir geri sayımla (-t)
çalışmıyor

Evet ama bu soruda sorulmamış, değil mi?
gniourf_gniourf

3
Yapabileceğiniz yeni bir soru sormak ve kendiniz cevaplamak ;). SO'ya izin verilir! ancak diğer soruları ilgisiz şeylerle kirletmek istemiyoruz.
gniourf_gniourf
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.