Ага, в Bash раскрытие фигурных скобок выполняется в первую очередь перед раскрытием переменных. Это означает, что это не работает так, как вы хотите:
$ a=1; b=5; echo {$a..$b}
{1..5}
(Сначала фигурные скобки раскрываются, давая {$ a .. $ b}
, затем переменные, давая {1 .. 5}
.)
Но вы можете сделать это (если вы когда-нибудь придумали ему применение):
$ aa=123;ab=456; echo $a{a,b}
123 456
Использование eval
работает, поскольку оно вызывает дополнительный проход оценки, но это обычно не очень хорошая идея, так как она будет оценивать, например, расширения команд и другие расширения из имен файлов, содержащих знаки $
, что обычно не то, что вам нужно.
Если у вас есть числовой диапазон, как здесь, вы можете использовать цикл:
S=1;E=3;
for (( i=$S; i <= $E; i++ )) ; do
echo $i
done
или:
while [ $S -le $E ] ; do
echo $S
S=$[ $S + 1]
done
Кроме того, zsh
выполняет расширение фигурных скобок, как вы хотели:
$ zsh -c 'a=1; b=5; echo {$a..$b}'
1 2 3 4 5