для i в {1 .. $ VAR}; do echo $ i; сделанный

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

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

В системе с четырьмя ядрами я ожидал бы, что скрипт bash будет выполняться 4 раза, увеличивая ядро ​​от 0 до 3.

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

{0..3}

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

2

4 ответы

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

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

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

for ((i=1; i<=n; i++)); do ...
5
добавлено

Bash is not parsed that way; use

for ((i=0; i

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

4
добавлено
Двойные скобки являются маркерами арифметической оценки.
добавлено автор glenn jackman, источник
Благодаря! Но почему двойная скобка?
добавлено автор Dog eat cat world, источник

Вы ищете seq .

for core in $(seq 0 $CPU_COUNT); do 
3
добавлено
Большое спасибо. Он также выглядит очень pythonic :)
добавлено автор Dog eat cat world, источник

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

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

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

1
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.