для меня в {1 .. $ VAR};сделать эхо $ я;сделанный - PullRequest
3 голосов
/ 27 октября 2011

Я пытаюсь сделать следующее:

CPU_COUNT=$(cat /proc/stat | grep -E "^cpu[[:digit:]]+ " | wc -l)
let CPU_COUNT=CPU_COUNT-1
for core in {0..$CPU_COUNT}; do
 echo $core
done

В системе с 4 ядрами я ожидаю, что bash-скрипт зациклится 4 раза, увеличивая ядро ​​с 0 до 3.

Вывод, который я получаю, однако:

{0..3}

То, что я делаю, явно неверно, но как мне заставить его работать как задумано?

Ответы [ 4 ]

5 голосов
/ 27 октября 2011

Из руководства bash :

Выражение последовательности принимает вид {x..y [.. incr]}, где x и y являются целыми числами или одиночнымисимволы, а incr, необязательное приращение, является целым числом.

Таким образом, bash не поддерживает переменные в выражениях последовательности.Вместо этого вы можете использовать цикл for:

for ((i=1; i<=n; i++)); do ...
5 голосов
/ 27 октября 2011

Bash не обрабатывается таким образом ;использовать

for ((i=0; i<CPU_COUNT; i++))

Дополнительным преимуществом является отсутствие вилки.

4 голосов
/ 27 октября 2011

Вы ищете seq.

for core in $(seq 0 $CPU_COUNT); do 

Редактировать : Вы можете использовать getconf (1), чтобы получить количество доступных процессоров:

CPU_COUNT=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
1 голос
/ 27 октября 2011

Используйте этот синтаксис ( zsh , ksh93 и bash ):

for ((core = 0; ++core <= ${CPU_COUNT:-0};)); do
 echo $core
done

Вы также можете использовать eval , но это будет ужасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...