realpath
разрешает заданный путь. Помимо прочего, он также удаляет завершающие косые черты. Используйте -s
для предотвращения следующих симлинков
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Ваш скрипт работает не так, как вы ожидаете, из-за порядка раскрытия.
Из руководства по bash:
The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and pathname expansion.
Как видите, раскрытие фигурных скобок идет первым, раскрытие переменных — позже. В присваивании раскрытие скобок не выполняется. В противном случае выражение x={1,2}
было бы расширено до x=1 x=2
, что также не имело бы смысла.
Одним из решений для этого, как вы узнали, является eval
, потому что все расширение выполняется дважды, поэтому первое раскрытие переменной выполняется перед раскрытием второй скобки.
Убедитесь, что вы понимаете риски eval
, в частности, никогда не используйте его для ненадежного ввода.
Поскольку вы используете bash, вы можете использовать массив.
files=(./*"$pattern"I{"$ifirst".."$ilast"}.ext )
cp "${files[@]}"../"$pattern"/"$i"/