मैं {1 .. $ VAR} में; 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

4 कोर के साथ एक सिस्टम पर, मैं बैश स्क्रिप्ट को 4 गुना लूप करने की अपेक्षा करता हूं, 0 से 3 तक कोर बढ़ाता हूं।

मुझे प्राप्त होने वाला आउटपुट हालांकि है:

{0..3}

मैं जो कर रहा हूं वह स्पष्ट रूप से गलत है, लेकिन मैं इसे इरादे के रूप में कैसे काम करूं?

2

4 उत्तर

बैश मैन्युअल से:

अनुक्रम अभिव्यक्ति फॉर्म {x..y [.. incr]} लेती है, जहां x और y हैं   या तो पूर्णांक या एकल वर्ण, और incr, एक वैकल्पिक वृद्धि,   एक पूर्णांक है।

तो बैश अनुक्रम अभिव्यक्तियों में चर का समर्थन नहीं करता है। आप इसके बजाय के लिए लूप का उपयोग कर सकते हैं:

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
जोड़ा
बहुत धन्यवाद। यह भी बहुत पाइथनिक दिखता है :)
जोड़ा लेखक Dog eat cat world, स्रोत

इसका उपयोग करें ( zsh , ksh93 और bash विशिष्ट) वाक्यविन्यास:

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

आप eval का भी उपयोग कर सकते हैं, लेकिन यह बदसूरत होगा।

1
जोड़ा