2012-02-08 4 views
2

У меня есть тривиальный цикл цикла в скрипте bash, который не работает, и я не вижу, что не так.Расширение байт и расширение функциональных параметров

#!/bin/bash 
function deleteOut { 

for index in {0..$1} 
do 
    echo "/bin/rm -rf ./OUT/Message_${index}.log" 
    /bin/rm -rf ./OUT/Message_${index}.log 
done 
} 

и назвал его помощью

deleteOut 5

Я ожидал, что цикл, как

/bin/rm -rf ./OUT/Message_0.log 
    /bin/rm -rf ./OUT/Message_1.log 
    /bin/rm -rf ./OUT/Message_2.log 
    /bin/rm -rf ./OUT/Message_3.log 
    /bin/rm -rf ./OUT/Message_4.log 
    /bin/rm -rf ./OUT/Message_5.log 

Вместо этого я получил

/bin/rm -rf ./OUT/Message_{0..5}.log 

Я решил эту проблему, делая что-то вроде этого вместо

find ./OUT -name "Message_*.log" | xargs /bin/rm 

, но это не главное. Почему мой первый подход не сработал?

ответ

2

Использование eval или подоболочка

расширения Brace приходит до того расширения переменной

for index in $(eval "echo {0..$q}") 
do 
    echo $index 
done 
1

Вы можете использовать seq, что в целом безопаснее, чем eval:

for index in $(seq $1) 

или даже быстрее without any external program:

for ((index=1; index<=$1; index++)) 
+0

Вторая команда была бы правильной, если index = 0. Первая команда не используется, потому что диапазон был 0 .. $ 1, а seq (насколько мне известно) начинаются с 1. Но на самом деле вы отвечаете, как перебирать файлы, тогда как мой вопрос касается расширения параметра в диапазоне. Ответ от «sehe» ​​правильный: «Расширение скобки происходит до изменения переменной» (я этого не знал). В любом случае, спасибо за ваш ответ. – Luixv

+0

Ссылка объясняет проблему расширения и ссылки на дополнительную информацию. – l0b0

Смежные вопросы