En supposant que vous ayez une chaîne avec des espaces comme séparateurs:
newline_separated=${space_separated// /$'\n'}
Cependant, vous posez probablement la mauvaise question. (Pas nécessairement, par exemple, cela pourrait apparaître dans un fichier makefile.) Une liste de noms de fichiers séparés par des espaces ne fonctionne pas vraiment: que se passe-t-il si l'un des noms de fichiers contient des espaces?
Si un programme reçoit des noms de fichiers sous forme d'arguments, ne les associez pas à des espaces. Utilisez "$@"
pour y accéder un par un. Bien que echo "$@"
les arguments soient séparés par des espaces, cela est dû à echo
: il affiche ses arguments avec des espaces comme séparateurs. somecommand "$@"
transmet les noms de fichiers sous forme d'arguments distincts à la commande. Si vous souhaitez imprimer les arguments sur des lignes séparées, vous pouvez utiliser
printf '%s\n' "$@"
Si vous avez des noms de fichiers séparés par des espaces et que vous souhaitez les utiliser dans un tableau, vous pouvez utiliser un développement de variable non entre guillemets pour scinder la valeur en caractères IFS
(vous devez désactiver le développement de caractères génériques set -f
, sinon glob les motifs seront étendus dans la valeur):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
Vous pouvez encapsuler ceci dans une fonction qui restaure le -f
réglage et la valeur IFS
quand c'est fait:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …