J'ai besoin de lire une valeur du terminal dans un script bash. Je voudrais pouvoir fournir une valeur par défaut que l'utilisateur peut modifier.
# Please enter your name: Ricardo^
Dans ce script, l'invite est "Veuillez entrer votre nom:" la valeur par défaut est "Ricardo" et le curseur se trouverait après la valeur par défaut. Existe-t-il un moyen de faire cela dans un script bash?
input
, puis utilisationname=${input:-$name}
.name=${!input:-$name}
faire?$1
devient${1:-some_default_string}
la source
-e
semble être obligatoire pour permettre-i
de travailler réellementDans Bash 4:
Cela affiche le nom après l'invite comme ceci:
avec le curseur à la fin du nom et permet à l'utilisateur de le modifier. La dernière ligne est facultative et force le nom à être la valeur par défaut d'origine si l'utilisateur efface l'entrée ou la valeur par défaut (en soumettant une valeur nulle).
la source
name
place deinput
dans laread
commande.$name
est conservée si l'utilisateur supprime la valeur proposée (et saisit donc une chaîne nulle). Tout dépend de vos besoins. Je l'ai dit dans ma réponse. Vous avez raison, cependant, que j'aurais pu être plus explicite et dire que si la ligne optionnelle n'avait pas été utilisée, la variable aurait pu l'êtrename
.Code:
Exemple d'exécution:
la source
J'ai trouvé cette question en cherchant un moyen de présenter quelque chose comme:
En utilisant les exemples ci-dessus, j'ai déduit ceci: -
J'espère que cela aide quelqu'un à ne pas avoir à réfléchir à la logique, s'il rencontre le même problème
la source
Je viens d'utiliser ce modèle, que je préfère:
la source
Définissez la valeur par défaut; imprime le; lire une nouvelle valeur; s'il y a une nouvelle valeur, utilisez-la à la place de la valeur par défaut. Il existe (ou existait) des variations entre les shells et les systèmes sur la façon de supprimer une nouvelle ligne à la fin d'une invite. La notation '\ c' semble fonctionner sur MacOS X 10.6.3 avec un bash 3.x, et fonctionne sur la plupart des variantes d'Unix dérivées de System V, en utilisant des shells Bourne ou Korn.
Notez également que l'utilisateur ne se rendrait probablement pas compte de ce qui se passe dans les coulisses; leurs nouvelles données seraient entrées après le nom déjà affiché à l'écran. Il vaut peut-être mieux le formater:
la source
printf
est plus portable queecho
if (test -z "$xxx"); ...
' et d'autres shellismes C.\c
, car il prend également en chargeecho -n
! Cependant, vous devez ajouter-e
pour obtenir l'écho de bash pour interpréter les échappements. Je suppose que\c
c'est pour les choses nonecho -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
$ bash --version
GNU bash, version 4.3.33(0)-release
a) "Je voudrais pouvoir fournir une valeur par défaut que l'utilisateur peut changer." Votreecho "Please enter your name: $name \c"
ne me permet pas de modifier la valeur par défaut. b) "et le curseur serait après la valeur par défaut." Pas vrai non plus ... La réponse de @Paused jusqu'à nouvel ordre. répond aux deux exigences.la source
Les paramètres -e et -t ne fonctionnent pas ensemble. J'ai essayé quelques expressions et le résultat était l'extrait de code suivant:
la source
;)
. Ceci est autorisé sur SO! mais nous ne voulons pas polluer d'autres questions avec des choses sans rapport.