Shell Script: bonne façon de déclarer un tableau vide
Je suis en train de déclarer un tableau vide en Script Shell, mais je suis en train de vivre une erreur.
#!/bin/bash
list=$@
newlist=()
for l in $list; do
newlist+=($l)
done
echo "new"
echo $newlist
Quand je l'execute, je reçois test.sh: 5: test.sh: Syntax error: "(" unexpected
- Le Code s'exécute sans erreur
- Êtes-vous sûr d'exécution de votre script avec
bash
? On dirait que le script est en cours d'exécution à l'aide desh
, auquel cas les tableaux ne sont pas pris en charge. - Aussi, l'attribution
$@
à un autre paramètre perd les avantages de$@
, à savoir que l'espace blanc à l'intérieur d'un seul argument de ligne de commande est conservée. Fossélist
et l'utilisationfor l in "$@"; do
directement.
Vous devez vous connecter pour publier un commentaire.
L'exécuter avec bash:
Et de voir l'erreur, il semble que vous êtes effectivement en cours d'exécution avec le dash:
Seulement cette fois, vous avez probablement utilisé le lien (/bin/sh -> /bin/dash).
bash script.sh
travaillé. Mais ... pourquoi même avec#!/bin/bash
il s'exécute sur le dash? J'ai tapéexport
et mon SHELL est fixé à bash.sh
. Vous pouvez voir où il se pointant avecls -l /bin/sh
oureadlink $(which sh)
. Par la manière, le moyen le plus rapide pour déclarer votre variable tableaunewlist
en fonction de vos arguments estnewlist=("$@")
. Notez que si args est"a b" "c" "d"
, sans les guillemets ($@
) il permettrait de diviser à 4 arguments lorsqu'il est déplié ("a" "b" "c"
) en raison de couper un mot alors qu'avec"$@"
les valeurs restent comme avec l'espace.#!
ne fonctionne que si vous l'exécutez une commande par rendre le fichier exécutable (chmod +x test.sh
) et puis, juste en tapant le nom de fichier sans aucune sorte d' *sh en face d'elle:./test.sh
. Si vous taper le nom d'une coquille commesh
oubash
que la commande à exécuter, alors que c'est la commande qui est exécuté; et un shell, le#!
ligne est un commentaire../test.sh
maisdash
est toujours celui qui a exécuté/bin/sh
est lié, parce que la ligne shebang a/bin/bash
en elle.dash
n'aurait pas couru avec elle, mais il affirme qu'il n'.Je trouve suivant la syntaxe plus lisible.
Pour plus de détails, voir Bash Guide pour les Débutants: 10.2. Variables de tableau.
Essayer ce pour voir si vous sont orientés vers le tableau de bord ou bash
Si elle dit
/bin/sh -> /bin/dash
, puis tapez ceci:Puis tapez à nouveau:
doit alors dit quelque chose comme ceci:
Cela signifie que maintenant
sh
est correctement orienté pour Bash et vos tableaux fonctionne.En BASH 4+, vous pouvez utiliser la commande suivante pour déclarer un Tableau vide:
Vous pouvez ensuite ajouter de nouveaux éléments par:
Si le tableau est vide viens de le faire:
Vous pouvez le vérifier avec:
non vide déclaration de tableau ressemble à ceci:
Pour remplir un tableau en cours de processus:
Espère que cette aide
NEWLIST
a une longueur de 1 dans cet exemple. Essayez écho${#NEWLIST[@]}
par la suite afin de voir cela.NEWLIST
n'est pas un tableau vide, car il est de longueur 1. Je suis désolé, mais vous n'avez pas répondu correctement à la question. Votreif
instruction de ne pas le tester correctement.