Est-il possible d'utiliser des variables dans les accolades dans Bash?

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