Je veux écrire une variable de tableau bash dans un fichier, avec chaque élément sur une nouvelle ligne. Je pourrais le faire avec un boucle for, mais existe-t-il un autre moyen (plus propre) de joindre les éléments avec \n
?
Réponses
Trop de publicités?Mon point de vue en n'utilisant que des modules Bash, sans altérer IFS
:
# $1 separator
# $2… strings
join_strings () {
declare separator="$1";
declare -a args=("${@:2}");
declare result;
printf -v result '%s' "${args[@]/#/$separator}";
printf '%s' "${result:${#separator}}"
}
Exemple
$ join_strings $'\n' "a b c" "d e f" "g h i"
a b c
d e f
g h i
Vous pouvez également utiliser n'importe quel séparateur :
$ join_strings '===' "a b c" "d e f" "g h i"
a b c===d e f===g h i
printf
semble être l'approche la plus efficace pour créer une chaîne délimitée à partir d'un tableau :
# create a delimited string; note that printf doesn't put the trailing delimiter
# need to save and restore IFS
# it is prudent to put the whole logic on a single line so as to minimize the risk of future code changes breaking the sequence of saving/restoring of IFS
oldIFS=$IFS; IFS=$'\n'; printf -v var "${arr[*]}"; IFS=$oldIFS
# print string to file; note that the newline is required in the format string because printf wouldn't put a trailing delimiter (which is a good thing)
printf '%s\n' "$var" > file
Une façon encore plus simple de procéder est la suivante :
delim=$'\n'
printf -v var "%s$delim" "${arr[@]}" # create a delimited string
var="${var%$delim}" # remove the trailing delimiter
Exemple
delim=:
arr=(one two three)
printf -v var "%s$delim" "${arr[@]}" # yields one:two:three:
var="${var%$delim}" # yields one:two_three
Comme nous l'avons déjà dit, les éléments suivants :
$ printf -v var "%s\n" "${System[@]}"
fonctionne, si vous convertissez en une chaîne de caractères, mais vous devez faire face à la ligne blanche unique à la fin. Je trouve que vous pouvez éviter cela en utilisant la substitution de commande à la place, donc
$ var=$(printf '%\n' "${System[@]}")
devrait fonctionner parfaitement. N'oubliez pas de citer var pour obtenir l'effet désiré !
- Réponses précédentes
- Plus de réponses