1
votes

Écrire si la condition comme fonction

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"


1 commentaires

Personnellement, je pense que cela rend le code moins lisible. Je ne ferais pas ça


3 Réponses :


0
votes

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"


2 commentaires

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.



2
votes

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.


2 commentaires

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"



0
votes

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>


0 commentaires