J'essaie d'écrire une condition If en tant que fonction et je ne suis pas sûr que cela soit même possible.
Cas suivant:
File1
if_exit "[ $(lsb_release -is) != 'Debian' ] && [ $(lsb_release -cs) != 'stretch' ]" "The script only works with Stretch"
3 Réponses :
Vous devrez probablement jouer avec eval
pour que cela fonctionne comme vous le souhaitez, ce que vous voulez généralement éviter à tout prix. Pour votre cas d'utilisation, je recommanderais:
function die() { echo "$1" exit 1 } [ "$SUUSER" != 'root' ] && die "Please run the script as root" [ "$(lsb_release -is)" != 'Debian' && "$(lsb_release -cs)" != 'stretch' ] && die "The script only works with Stretch"
Pour plus de variantes de die
, voir aussi stackoverflow.com/questions/7868818/...
Pourquoi ne pas utiliser echo "$ @"
dans la fonction die ()
? Ik aidera ceux qui sont paresseux avec des citations.
Je refactoriserais pour que vous n'ayez pas à utiliser des guillemets autour des arguments.
if_exit() { local message=$1 shift if "$@"; then echo "$0: $message" >&2 exit 1 fi } # Tangentially, don't use upper case for private variables Suuser=$(whoami) if_exit "Please run the script as root" [ "$Suuser" != 'root' ]
Notez également comment nous affichons les diagnostics d'erreur standard, et veillez à inclure le nom du script qui a provoqué l'impression du diagnostic.
Ainsi, la fonction reçoit la setence et la stocke dans le message. Après cela, vous utilisez shift pour basculer l'autre valeur de retour vers la «gauche»? Mais comment puis-je utiliser votre solution avec une comparaison comme celle-ci? if_exit "Veuillez exécuter avec Buster" [$ (lsb_release -is)! = 'Debian'] && [$ (lsb_release -cs)! = 'stretch'] Et c'est un bon rappel avec les noms de variables: P PS: C'est mauvais style d'utiliser une telle construction pour raccourcir le code du programme? Merci d'avance que vous répondiez à ma question de débutant: P!
L'argument ne peut être qu'une simple commande avec cette solution. Pour les commandes complexes, j'irais avec [$ (lsb_release -is)! = 'Debian'] && [$ (lsb_release -cs)! = 'Stretch'] || die "Veuillez courir avec Buster"
Lorsque vous n'avez qu'un petit nombre de chèques, vous pouvez utiliser [[$ SUUSER! = 'Root']] && {echo "Veuillez exécuter le script en tant que root"; écho sortie 1; }
Quand vous avez beaucoup de vérifications, j'utiliserais une fonction die ()
comme @erik_dannenberg a écrit.
hors sujet: vous devriez écrire vos propres variables shell en minuscules, comme ${su_user}
.
Une des raisons de la fonction proposée est la possibilité de montrer quel test a échoué (comparez "$ {su_user}" code> avec
root
). Lorsque vous le souhaitez, créez une fonction comme
checkroot ()
. Vous aurez beaucoup de responsabilités lorsque vous voudrez prendre en charge tous les caractères spéciaux normaux.
J'ai essayé quelque chose avec le support de la syntaxe [...]
. Voyez-vous ce qui ne va pas avec cette "solution"?
if_exit() { # incorrect function # skip first '[' shift # split line around ] IFS="]" read -r testparams errormessage <<< "${@}" if [ ${testparams} ] ; then echo "Test [ ${testparams% } ] failed: ${errormessage# }" # exit 1 fi } if_exit [ -f non_existing_file ] "file not existing" su_user="root" if_exit [ "${su_user}" \!= root ] "Please run the script as root" echo "Another test with wrong user" su_user="aeris" if_exit [ "${su_user}" \!= root ] "Please run the script as root"
Vous avez l'air bien, à l'exception du point d'exclamation?
Il échouera lorsque su_user
est vide ou contient des espaces ( su_user = "Je ne veux pas être testé"
).
Vous pouvez résoudre ce problème dans la fonction if_exit ()
, mais vous continuerez à rencontrer de nouveaux problèmes (comme des espaces dans le nom de fichier).
Vous pouvez rechercher le code source de test.c, mais vous devriez laisser tomber vos bonnes intentions et choisir une autre solution ( die ()
ou compare_strings ()
). p>
Personnellement, je pense que cela rend le code moins lisible. Je ne ferais pas ça