voor i in {1 .. $ VAR}; echo $ i; gedaan

Ik probeer het volgende te doen:

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

Op een systeem met 4 kernen zou ik verwachten dat het bash-script vier keer wordt herhaald, waardoor de kern van 0 naar 3 wordt verhoogd.

De output die ik ontvang is echter:

{0..3}

Wat ik doe is duidelijk verkeerd, maar hoe zorg ik ervoor dat het werkt zoals het bedoeld is?

2

4 antwoord

Uit de bash-handleiding :

Een reeksuitdrukking heeft de vorm {x..y [.. incr]}, waarbij x en y zijn   gehele getallen of enkele karakters, en incr, een optionele toename,   is een geheel getal.

Dus bash ondersteunt geen variabelen in reeksuitdrukkingen. U kunt in plaats daarvan een voor lus gebruiken:

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

Bash is not parsed that way; use

for ((i=0; i

Een bijkomend voordeel is het ontbreken van een vork.

4
toegevoegd
Dubbele haakjes zijn de rekenkundige evaluatiemarkeringen.
toegevoegd de auteur glenn jackman, de bron
Bedankt! Maar waarom het dubbele haakje?
toegevoegd de auteur Dog eat cat world, de bron

U zoekt seq .

for core in $(seq 0 $CPU_COUNT); do 
3
toegevoegd
Geweldig, bedankt. Het ziet er ook erg pythisch uit :)
toegevoegd de auteur Dog eat cat world, de bron

Gebruik deze syntaxis ( zsh , ksh93 en bash specifiek):

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

U kunt ook eval gebruiken, maar dat zou lelijk zijn.

1
toegevoegd