65 votes

Comment convertir une variable de tableau bash en une chaîne de caractères délimitée par des nouvelles lignes ?

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 ?

1voto

Jon Points 11

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

0voto

Paul Lam Points 649

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

0voto

serialhobbyist Points 2554

Voici mon impression de joinArray :

function joinArray() {
  local delimiter="${1}"
  local output="${2}"
  for param in ${@:3}; do
    output="${output}${delimiter}${param}"
  done

  echo "${output}"
}

0voto

Nerdilicious Points 3

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é !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X