Je cherche une solution à un problème Bash 4 que j'ai.
Bash 4 est capable d'itérer avec des zéros de tête.
Pour la ligne:
for i in {001..005}; do echo -n $i" ";done;echo
la sortie est
001 002 003 004 005
mais quand j'essaye ça:
a="005"; for i in {001..${a}}; do echo $i;done
ou quelque chose de similaire, le résultat est:
{001..005}
Qu'est-ce qui me manque?
Votre problème est l'ordre dans lequel l'expansion d'accolade et l'expansion variable sont appliquées. Vous devez forcer l'ordre inverse:
a=005 eval echo {001..$a}
L'expansion de l'accolade est réalisée avant toute autre extension ….
Vous pourriez utiliser seq
place:
$ a="005"; for i in $(seq -f %03g 001 ${a}); do echo $i;done 001 002 003 004 005
L'expansion de l'accolade se produit très tôt lors de l' expansion (première chose, en fait), avant expansion variable. Pour effectuer une expansion d'accolade sur le résultat d'une expansion variable, vous devez utiliser eval
, mais cela a tendance à être maladroit.
Le moyen facile d'itérer consiste à utiliser une variable de countur.
for ((i = 1; i < 5; i++)); do echo -n $i" "; done
Pour append les zéros à gauche, vous pouvez formater le numéro avec printf:
for ((i = 1; i < 5; i++)); do printf "%03d " $i; done
Une astuce alternative est de countr les nombres qui sont une puissance de dix plus grande, et dépouiller le préfixe étranger.
delta=1000 for ((i = $((delta+1)); i < $((delta+5)); i++)); do echo -n "${i#1} "; done