我在{1 .. $ VAR};回声$ i; DONE

时间:2011-10-27 13:27:49

标签: bash for-loop

我正在尝试执行以下操作:

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 个答案:

答案 0 :(得分:5)

Bash is not parsed that way;使用

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

另一个优点是没有叉子。

答案 1 :(得分:5)

来自bash manual

  

序列表达式采用{x..y [.. incr]}的形式,其中x和y是   整数或单个字符,incr,可选的增量,   是一个整数。

所以bash不支持序列表达式中的变量。您可以改为使用for循环:

for ((i=1; i<=n; i++)); do ...

答案 2 :(得分:4)

您正在寻找seq

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

编辑:您可以使用getconf(1)获取可用的CPU数量:

CPU_COUNT=$(getconf _NPROCESSORS_ONLN 2>/dev/null)

答案 3 :(得分:1)

使用此语法( zsh ksh93 bash 特定)语法:

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

你也可以使用 eval ,但这很难看。