Расширение Bash loop и функциональных параметров - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть тривиальный цикл for в скрипте 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 ]

2 голосов
/ 08 февраля 2012

Использовать eval или подоболочку

Расширение скобки наступает до переменного расширения

 for index in $(eval "echo {0..$q}")
 do 
     echo $index
 done
1 голос
/ 08 февраля 2012

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

for index in $(seq $1)

Или даже быстрее без какой-либо внешней программы :

for ((index=1; index<=$1; index++))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...