Je veux écrire une variable de tableau bash dans un fichier, avec chaque élément sur une nouvelle ligne. Je pourrais le faire avec une boucle for, mais existe-t-il un autre moyen (plus propre) de joindre les éléments \n
?
Voici un moyen qui utilise l’extension du paramètre bash et sa IFS
variable spéciale.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
Nous utilisons un sous-shell pour éviter d'écraser la valeur de IFS
dans l'environnement actuel. Dans ce sous-shell, nous modifions ensuite la valeur de IFS
afin que le premier caractère soit une nouvelle ligne (en utilisant des $'...'
guillemets). Enfin, nous utilisons les paramètres de développement pour imprimer le contenu du tableau sous la forme d’un mot unique; chaque élément est séparé par le premier caractère de IFS
.
Pour capturer une variable:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
Si votre bash est suffisamment nouveau (4.2 ou ultérieur), vous pouvez (et devriez) toujours utiliser printf
avec l' -v
option:
$ printf -v var "%s\n" "${System[@]}"
Dans les deux cas, vous ne voudrez peut-être pas la nouvelle ligne finale var
. Pour l'enlever:
$ var=${var%?} # Remove the final character of var
var=${var%?}
place? Ce n'est pas une expression régulière et.
ne correspondra donc qu'à un point.$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
Vous pouvez utiliser
printf
pour imprimer chaque élément du tableau sur sa propre ligne:la source
ou
ou
ou
ou
ou
ou
ou
c'est tout ce que je peux rappeler jusqu'à présent.
la source
Les solutions ci-dessus sont à peu près ce qu'elles sont, mais la question initiale demande une sortie dans un fichier:
Notes: 1) 'echo' fournit la nouvelle ligne finale. 2) Si bash veut à nouveau lire ce fichier, bas, alors -p peut être la sérialisation désirée.
la source
Utilisant pour :
Utiliser l' histoire ; notez que cela échouera si vos valeurs contiennent
!
:Utiliser le nom de base ; notez que cela échouera si vos valeurs contiennent
/
:En utilisant shuf ; notez que les résultats risquent de ne pas apparaître dans l'ordre:
la source
Ma prise , en utilisant uniquement les commandes intégrées de Bash, sans mutation
IFS
:Exemple
Vous pouvez également utiliser n'importe quel séparateur:
la source
printf
semble être l’approche la plus efficace pour créer une chaîne délimitée à partir d’un tableau:Une façon encore plus simple de faire ceci est:
Exemple
la source