Question Portée des variables dans KSH


J'ai écrit un exemple de fonction KornShell pour fractionner une chaîne, la mettre dans un tableau et imprimer les valeurs. Le code est comme ci-dessous

#!/usr/bin/ksh

splitString() {

    string="abc@hotmail.com;xyz@gmail.com;uvw@yahoo.com"

    oIFS="$IFS"; 
    IFS=';' 
    set -A str $string
    IFS="$oIFS"
}

splitString
echo "strings count = ${#str[@]}"
echo "first : ${str[0]}";
echo "second: ${str[1]}";
echo "third : ${str[2]}";

Maintenant le echo ne pas imprimer les valeurs du tableau, donc je suppose qu'il a quelque chose à voir avec la portée du tableau défini.

Je suis nouveau sur le script Shell, quelqu'un peut-il m'aider à comprendre la portée des variables dans l'exemple ci-dessus?


10
2017-08-17 06:43


origine


Réponses:


La portée par défaut d'une variable est le script entier.

Cependant, lorsque vous déclarez une variable dans une fonction, la variable devient locale à la fonction qui la déclare. Ksh a cadrage dynamique, la variable est également accessible dans les fonctions appelées par la fonction qui déclare la variable. Ceci est très documenté dans le section sur les fonctions du manuel. Notez que dans AT & T ksh (par opposition à pdksh et aux dérivés, et aux fonctionnalités similaires de bash et de zsh), cela ne s'applique qu'aux fonctions définies avec le function mot-clé, pas aux fonctions définies avec le traditionnel f () { … } syntaxe. Dans AT & T ksh93, toutes les variables déclarées dans les fonctions définies avec la syntaxe traditionnelle sont globales.

La principale façon de déclarer une variable est avec le typeset  intégré. Il crée toujours une variable locale (dans AT & T ksh, uniquement dans les fonctions déclarées avec function). Si vous affectez une variable sans l'avoir déclarée avec typesetc'est global.

La documentation ksh ne spécifie pas si set -A rend une variable locale ou globale, et différentes versions le font non plus. Sous ksh 93u, pdksh ou mksh, la variable est globale et votre script imprime la valeur. Vous semblez avoir ksh88 ou une version antérieure de ksh dont la portée est locale. Je pense que l'initialisation str en dehors de la fonction créerait une variable globale, mais je ne suis pas sûr.

Notez que vous devez utiliser une variable locale pour remplacer la valeur de IFS: sauvegarder sur une autre variable n'est pas seulement maladroit, c'est aussi fragile car il ne restaure pas IFS correctement s'il était hors service. En outre, vous devez désactiver la globalisation, car sinon, si la chaîne contient des caractères de globalisation de shell ?*\[ et l'un des mots arrive à correspondre à un ou plusieurs fichiers sur votre système, il sera étendu, par ex. set -A $string où string est a;* aura pour résultat str contenant la liste des noms de fichiers dans le répertoire en cours.

set -A str
function splitString {
  typeset IFS=';' globbing=1
  case $- in *f*) globbing=;; esac
  set -f
  set -A str $string
  if [ -n "$globbing" ]; then set +f; fi
}
splitString "$string"

16
2017-08-17 10:28



Les variables sont généralement globales au shell dans lequel elles sont définies à partir du moment où elles sont définies.

le typeset commande peut les rendre locales à la fonction dans laquelle elles ont été définies, ou les rendre automatiquement exportées (même si elles sont mises à jour).

Lisez "composition" et "entier" dans la page de manuel, ou le livre de Korn.


2
2017-08-17 08:33