Comment split la sortie et la stocker dans un tableau?

C'est la sortie:

3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, h.264, 1029.1, 31, 31, 0,0,0.000000,31,31,0,0,0.000000,7,0,0,0.000000,30,1280 720,10,0,0,0.000000,30,1280 720 

J'ai essayé avec 2 scénario:

  1. Stockage dans un tableau

      @arr=split(',',$stats); echo "statistics: $stats" 
  2. Stockage dans une variable

      echo $stats | cut -d ',' -f | read s1 echo $s1 

Mais aucun des deux scénarios ne fonctionne.

Vous pouvez utiliser quelque chose comme ceci, pour une seule ligne d'input:

 IFS="," read -ra arr <<< "$foo" 

Démo:

 $ cat t.sh foo="3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, ..." # snipped IFS="," read -ra arr <<< "$foo" echo ${#arr[@]} echo ${arr[0]} echo ${arr[30]} $ ./t.sh 31 3 1280 720 

Crédits: Split string basée sur le délimiteur dans bash? réponse de Johannes Schaub . Vérifiez les autres réponses là aussi.

Votre premier extrait n'est rien comme la syntaxe shell. C'est la syntaxe Perl correcte.
Votre deuxième extrait n'utilise pas la cut correctement; Je ne sais pas ce que tu voulais.

Le shell a une construction de séparation de strings embeddede: lorsque vous écrivez $somevar sans guillemets, le shell search d'abord la valeur de la variable somevar , puis fractionne cette valeur en des mots distincts sur les caractères spécifiés par IFS et interprète finalement chaque mot comme motif glob (file générique). Vous pouvez donc split une string en définissant IFS sur le caractère séparateur et en désactivant temporairement la fonction Glob.

 set -f; IFS=, arr=($stats) set +f; unset IFS 

Notez que si un champ contient des espaces, l'élément du tableau conservera ces espaces. Si vous voulez split à tous les espaces ainsi que les virgules, définissez IFS=', ' . Notez que IFS n'est pas une string à split mais un set de caractères à séparer; un espace ou une virgule constituera un séparateur. De plus, il existe des règles spéciales pour les espaces: toute séquence de zéro ou plusieurs espaces suivie d'une virgule suivie de zéro ou plus d'espaces constituera un séparateur et toute séquence d'un ou plusieurs espaces constituera également un séparateur.

Si vous voulez uniquement supprimer des espaces au début ou à la fin d'un champ, vous devrez le faire élément par élément.

 shopt -s extglob for ((i=0; i<${#arr[@]}; i++)); do arr[i]=${arr[i]#+( )} # ssortingp one or more spaces at the beginning arr[i]=${arr[i]%+( )} # ssortingp one or more spaces at the end done 
 $ set -f # turn off globbing, so as not to expand wildcards $ arr=($(echo "$stats" | sed 's/,/ /g')) $ echo ${arr[1]} aac-lc