GNU/Linux >> Tutoriels Linux >  >> Linux

Tableaux dans Unix Bourne Shell ?

J'essaie d'utiliser des tableaux dans le shell Bourne (/bin/sh ). J'ai trouvé que la façon d'initialiser les éléments du tableau est :

arr=(1 2 3)

Mais il rencontre une erreur :

syntax error at line 8: `arr=' unexpected

Maintenant, le post où j'ai trouvé cette syntaxe dit que c'est pour bash , mais je n'ai trouvé aucune syntaxe distincte pour Bourne Shell. La syntaxe est-elle la même pour /bin/sh aussi ?

Réponse acceptée :

/bin/sh n'est presque jamais un shell Bourne sur aucun système de nos jours (même Solaris, qui était l'un des derniers systèmes majeurs à l'inclure, est maintenant passé à un sh POSIX pour son /bin/sh dans Solaris 11). /bin/sh était l'obus Thompson au début des années 70. Le shell Bourne l'a remplacé dans Unix V7 en 1979.

/bin/sh a été le shell Bourne pendant de nombreuses années par la suite (ou le shell Almquist, une réimplémentation gratuite sur les BSD).

De nos jours, /bin/sh est plus communément un interpréteur ou un autre pour le POSIX sh langage qui est lui-même basé sur un sous-ensemble du langage de ksh88 (et un sur-ensemble du langage shell Bourne avec quelques incompatibilités).

Le shell Bourne ou la spécification du langage POSIX sh ne prennent pas en charge les tableaux. Ou plutôt ils n'ont qu'un seul tableau :les paramètres positionnels ($1 , $2 , [email protected] , donc un tableau par fonction également).

ksh88 avait des tableaux que vous avez définis avec set -A , mais cela n'a pas été spécifié dans le sh POSIX car la syntaxe est maladroite et pas très utilisable.

D'autres shells avec des variables de tableau/listes incluent :csh /tcsh , rc , es , bash (qui copiait principalement la syntaxe ksh à la manière de ksh93), yash , zsh , fish chacun avec une syntaxe différente (rc le shell de l'ancien successeur d'Unix, fish et zsh étant les plus cohérents)…

En sh standard (fonctionne également dans les versions modernes du shell Bourne):

set '1st element' 2 3 # setting the array

set -- "[email protected]" more # adding elements to the end of the array

shift 2 # removing elements (here 2) from the beginning of the array

printf '<%s>n' "[email protected]" # passing all the elements of the [email protected] array 
                     # as arguments to a command

for i do # looping over the  elements of the [email protected] array ($1, $2...)
  printf 'Looping over "%s"n' "$i"
done

printf '%sn' "$1" # accessing individual element of the array.
                   # up to the 9th only with the Bourne shell though
                   # (only the Bourne shell), and note that you need
                   # the braces (as in "${10}") past the 9th in other
                   # shells (except zsh, when not in sh emulation and
                   # most ash-based shells).

printf '%sn' "$# elements in the array"

printf '%sn' "$*" # join the elements of the array with the 
                   # first character (byte in some implementations)
                   # of $IFS (not in the Bourne shell where it's on
                   # space instead regardless of the value of $IFS)

(notez que dans le shell Bourne et ksh88, $IFS doit contenir le caractère espace pour "[email protected]" pour fonctionner correctement (un bogue), et dans le shell Bourne, vous ne pouvez pas accéder aux éléments au-dessus de $9 (${10} ne fonctionnera pas, vous pouvez toujours faire shift 1; echo "$9" ou faites une boucle dessus)).

En relation :$SHELL stocke-t-il le chemin d'accès au shell par défaut sous Linux ?
Linux
  1. Conseils sur le shell Unix :modifier le shell de connexion de Bash à d'autres

  2. 4 façons d'exécuter un script shell sous UNIX / Linux

  3. 3 scripts shell Unix - Activité de l'utilisateur, afficher les processus, afficher la mémoire

  4. Comment puis-je ftp et télécharger des fichiers à partir d'un script shell UNIX

  5. UNIX / Linux :Qu'est-ce qu'un Shell ? Quels sont les différents coquillages ?

SDF fournit un compte Unix Shell gratuit et un accès Shell à tous

Mac Os X est-il Unix ?

Linux contre Unix

Tableaux dans les scripts shell

Convertir une image en niveaux de gris en image de canal alpha dans le shell Unix

Quelle est la portée des variables shell exportées dans Unix ?