Muszę odczytać wartość z terminala w skrypcie bash. Chciałbym móc podać wartość domyślną, którą użytkownik może zmienić.
# Please enter your name: Ricardo^
W tym skrypcie monit brzmi „Proszę podać swoje imię:” wartością domyślną jest „Ricardo”, a kursor będzie znajdować się za wartością domyślną. Czy jest na to sposób w skrypcie bash?
input
a następnie użyciename=${input:-$name}
.name=${!input:-$name}
zrobisz$1
zostaje${1:-some_default_string}
źródło
-e
wydaje się to obowiązkowe, aby pozwolić-i
na faktyczne działanieW Bash 4:
Wyświetla nazwę po monicie w następujący sposób:
z kursorem na końcu nazwy i pozwala użytkownikowi ją edytować. Ostatni wiersz jest opcjonalny i wymusza, aby nazwa była oryginalną wartością domyślną, jeśli użytkownik usunie dane wejściowe lub wartość domyślną (przesłanie wartości null).
źródło
name
zamiastinput
wread
poleceniu.$name
zostaje zachowana, jeśli użytkownik usunie proponowaną wartość (a tym samym wprowadzi ciąg zerowy). Wszystko zależy od twoich potrzeb. Powiedziałem tak samo w swojej odpowiedzi. Masz jednak rację, że mógłbym być bardziej wyraźny i powiedziałem, że gdyby nie użyto linii opcjonalnej, zmienna mogłaby byćname
.Kod:
Przykładowy przebieg:
źródło
Znalazłem to pytanie, szukając sposobu na przedstawienie czegoś takiego:
Na podstawie powyższych przykładów wydedukowałem to:
Mam nadzieję, że pomoże to komuś nie myśleć o logice, jeśli napotka ten sam problem
źródło
Właśnie użyłem tego wzoru, który wolę:
źródło
Ustaw domyślne; Wydrukuj to; przeczytaj nową wartość; jeśli jest nowa wartość, użyj jej zamiast wartości domyślnej. Istnieją (lub były) różnice między powłokami i systemami dotyczące sposobu pomijania znaku nowej linii na końcu monitu. Notacja „\ c” wydaje się działać na MacOS X 10.6.3 z bash 3.x i działa na większości wariantów Uniksa pochodzących z Systemu V, przy użyciu powłok Bourne'a lub Korna.
Zauważ też, że użytkownik prawdopodobnie nie zda sobie sprawy z tego, co dzieje się za kulisami; ich nowe dane zostaną wprowadzone po nazwie już na ekranie. Może być lepiej sformatować:
źródło
printf
jest bardziej przenośny niżecho
if (test -z "$xxx"); ...
' i innych skorupiaków C.\c
, ponieważ obsługuje równieżecho -n
! Musisz jednak dodać,-e
aby echo basha interpretowało ucieczki. Chyba\c
chodzi o rzeczy, które pozostały niewypowiedziane:echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
źródło
Parametr -e i -t nie działają razem. wypróbowałem niektóre wyrażenia i wynik był następujący fragment kodu:
źródło
;)
. Jest to dozwolone na SO! ale nie chcemy zanieczyszczać innych pytań niepowiązanymi rzeczami.