J'essaie d'utiliser des tableaux dans Bourne shell ( /bin/sh
). J'ai trouvé que la façon d'initialiser les éléments d'un tableau est:
arr=(1 2 3)
Mais il rencontre une erreur:
syntax error at line 8: `arr=' unexpected
Maintenant, le message où j'ai trouvé cette syntaxe indique qu'elle est destinée bash
, mais je n'ai trouvé aucune syntaxe distincte pour le shell Bourne. La syntaxe est-elle également la même /bin/sh
?
shell
array
bourne-shell
SubhasisM
la source
la source
Réponses:
/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 POSIX sh 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ète ou un autre pour lesh
langage POSIX 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 ont seulement un tableau: les paramètres de position (
$1
,$2
,$@
, donc une matrice par fonction ainsi).ksh88 avait des tableaux avec lesquels vous définissez
set -A
, mais qui n'ont pas été spécifiés dans le POSIX sh car la syntaxe est maladroite et peu utilisable.D' autres coquilles avec des variables tableau / listes comprennent:
csh
/tcsh
,rc
,es
,bash
(qui la plupart du temps copié la syntaxe ksh la façon dont ksh93),yash
,zsh
,fish
chacun avec une syntaxe différente (rc
la coque de la fois à être le successeur d'Unix,fish
etzsh
étant la plus cohérente ceux) ...En standard
sh
(fonctionne également dans les versions modernes du shell Bourne):(notez que dans le shell Bourne et ksh88,
$IFS
doit contenir le caractère espace pour"$@"
fonctionner correctement (un bug), et dans le shell Bourne, vous ne pouvez pas accéder aux éléments ci-dessus$9
(${10}
ne fonctionnera pas, vous pouvez toujours faireshift 1; echo "$9"
ou boucler leur)).la source
"${@:2:4}"
. Bien sûr, je vois les similitudes , mais je ne considère pas les paramètres de position comme un tableau en soi."$@"
agit comme un tableau (comme les tableaux decsh
,rc
,zsh
,fish
,yash
...), il est plus Korn / bash « tableaux » qui ne sont pas vraiment des tableaux, mais certains forme de tableaux associatifs avec des clés limitées à des entiers positifs (ils ont également des indices commençant à 0 au lieu de 1 comme dans tous les autres shells avec des tableaux et "$ @"). Les shells qui prennent en charge le découpage peuvent découper $ @ tout de même (avec ksh93 / bash en ajoutant maladroitement $ 0 aux paramètres de position lorsque vous découpez "$ @").Il n'y a pas de tableaux en coque Bourne simple. Vous pouvez utiliser la méthode suivante pour créer un tableau et le parcourir:
Quelle que soit la façon d'utiliser les tableaux
sh
, choisiriez-vous que ce sera toujours lourd. Pensez à utiliser une langue différente commePython
ouPerl
si vous le pouvez, sauf si vous êtes coincé avec une plate-forme très limitée ou si vous voulez apprendre quelque chose.la source
$(...)
syntaxe. Il faut donc bien avoir le shell Bourne. Êtes-vous sur Solaris 10 ou avant? Il y a de fortes chances que vous n'en ayez pas nonseq
plus. Sous Solaris 10 et versions antérieures, vous souhaitez que / usr / xpg4 / bin / sh ait un standardsh
au lieu d'un shell Bourne. L'utilisation deseq
cette façon n'est pas très bonne non plus.seq
cette façon n'est-elle pas bonne?$(...)
plus`
, mais de l'OP/bin/sh
est probablement Bourne shell, pas une coquille POSIX. En plus deseq
ne pas être une commande standard, faire$(seq 100)
signifie stocker la totalité de la sortie en mémoire, ce qui signifie qu'elle dépend de la valeur actuelle de $ IFS contenant une nouvelle ligne et ne contenant pas de chiffres. Mieux à utiliseri=1; while [ "$i" -le 100 ]; ...; i=$(($i + 1)); done
(bien que cela ne fonctionnerait pas non plus dans le shell Bourne)./bin/sh
syntaxe portable plus tard, a tendance à faire croire aux gens qu'il est correct d'utiliser le mauvais#!/bin/sh
shebang, puis casse leurs scripts lorsque d'autres personnes essaient de les utiliser. Vous seriez bien avisé de ne pas poster ce genre d'appât de flamme. :)Comme les autres l'ont dit, le Bourne Shell n'a pas de vrais tableaux.
Cependant, selon ce que vous devez faire, des chaînes délimitées devraient suffire:
Si les délimiteurs typiques (espace, tabulation et nouvelle ligne) ne suffisent pas, vous pouvez définir le
IFS
délimiteur souhaité avant la boucle.Et si vous devez créer le tableau par programme, vous pouvez simplement créer une chaîne délimitée.
la source
split+glob
opérateur).Un moyen de simuler des tableaux en tiret (il peut être adapté à n'importe quel nombre de dimensions d'un tableau): (Veuillez noter que l'utilisation de la
seq
commande nécessite qu'elleIFS
soit définie sur '' (ESPACE = la valeur par défaut). Vous pouvez utiliserwhile ... do ...
oudo ... while ...
boucles à la place pour éviter cela (j'ai gardéseq
la portée d'une meilleure illustration de ce que fait le code).)la source
local
est pris en charge par les deuxbash
etdash
, ce n'est pas POSIX.seq
n'est pas non plus une commande POSIX. Vous devriez probablement mentionner que votre code fait quelques hypothèses sur la valeur actuelle de $ IFS (si vous évitez d'utiliserseq
et de citer vos variables, cela peut être évité)