VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
Résultat:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
Comment puis-je dire de readarray
ne pas ajouter la nouvelle ligne finale \n
? Quelle est la signification du dernier $
symbole?
bash
bash-array
user1156544
la source
la source
"What is the meaning of the latest $ symbol?"
Réponses:
Le caractère de fin de ligne implicite n'est pas ajouté par la fonction
readarray
intégrée, mais par la chaîne here-string (<<<
) debash
, voir Pourquoi une chaîne bash here ajoute-t-elle un caractère de fin de ligne? . Vous pouvez vous en débarrasser en imprimant la chaîne sans utiliser la nouvelle ligneprintf
et en la lisant sur une technique de substitution de processus< <()
générerait correctement maintenant
la source
Vous pouvez utiliser split + glob (ce qui se passe lorsque vous laissez une expansion sans guillemets dans des contextes de liste). Cela nous gêne la plupart du temps, il serait dommage de ne pas l'utiliser lorsque nous en avons réellement besoin:
C'est un peu moins compliqué que d'écrire un fichier temporaire, puis de l'appeler
readarray
comme dans l'readarray <<< "$string"
approche (notez également qu'ilreadarray -d
faut une version très récente debash
).Notez que malgré le
S
dansIFS
(qui signifie séparateur ), qui fonctionne de la même manière quereadarray
dansa,,b,
c'est divisé en"a"
,""
et"b"
seulement.Pour un véritable opérateur de fractionnement, vous pouvez utiliser à la
zsh
place:(
@
et les guillemets doubles pour conserver les éléments vides).la source
readarray <<< "$string"
écrit dans un fichier tempp, puis le supprime au lieu d'utiliser la mémoire?readarray -d
Une version en conserve de la réponse de @ StéphaneChazelas:
Le
local -
rendra les options commeset -f
(noglob
) locales à la fonction, tout comme les variables.Le
declare -n a=$1
va créer une variable localea
comme alias de la variable globale nommée par$1
(le premier argument de la fonction).la source