web-dev-qa-db-fra.com

Variables dans bash seq replacement ({1..10})

Est-il possible de faire quelque chose comme ça:

start=1
end=10
echo {$start..$end}
# Ouput: {1..10}
# Expected: 1 2 3 ... 10 (echo {1..10})
44
Tyilo

Dans bash, le développement d'accolade a lieu avant le développement de variable, ce qui n'est donc pas directement possible. 

Au lieu de cela, utilisez une boucle arithmétique for:

start=1
end=10
for ((i=start; i<=end; i++))
do
   echo "i: $i"
done

SORTIE

i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
i: 10
48
anubhava

Vous devriez envisager d'utiliser seq(1). Vous pouvez également utiliser eval:

eval echo {$start..$end}

Et voici seq

seq -s' ' $start $end
19
cnicutar

Si vous n'avez pas seq, vous voudrez peut-être vous en tenir à une simple boucle

for (( i=start; i<=end; i++ )); do printf "%d " $i; done; echo ""
7
glenn jackman

Vous devez utiliser eval:

eval echo {$start..$end}
6
bmk

Etes-vous certain que ce soit BASH? ZSH le gère comme vous le souhaitez. Cela ne fonctionnera pas dans BASH car le développement d'accolade a lieu avant tout autre type de développement, tel que le développement variable. Vous devrez donc utiliser une méthode alternative.

Une raison particulière pour laquelle vous avez besoin de combiner un croisement avec une expansion variable? Peut-être qu'une approche différente de votre problème éliminera la nécessité de le faire.

2
Spencer Rathbun

Normalement je fais juste ça:

echo `seq $start $end`
1
opsguy

use -s ex: seq -s '' 1 10 sortie: 1 2 3 4 5 6 7 8 9 10

0
lantian0811