في باش ، كيف يمكنني إضافة أعداد صحيحة مع الأصفار الرائدة والحفاظ على مخزن مؤقت محدد
-
02-10-2019 - |
سؤال
على سبيل المثال ، أريد الاعتماد من 001 إلى 100. وهذا يعني أن المخزن المؤقت صفر سيبدأ بـ 2 ، 1 ، ثم 0 في النهاية عندما يصل إلى 100 أو أكثر.
على سبيل المثال: 001 002 ... 010 011 ... 098 099 100
يمكنني القيام بذلك إذا كان للأرقام عدد محدد مسبقًا من الأصفار مع printf "٪ 02d" $ i. لكن هذا ثابت وليس ديناميكيًا ولن يعمل في مثالي.
المحلول
إذا كانت بستاتيك مقابل ديناميكي تقصد أنك ترغب في استخدام متغير للعرض ، فيمكنك القيام بذلك:
$ padtowidth=3
$ for i in 0 {8..11} {98..101}; do printf "%0*d\n" $padtowidth $i; done
000
008
009
010
011
098
099
100
101
يتم استبدال العلامة النجمية بقيمة المتغير الذي يتوافق معه في قائمة الوسيطة ($padtowidth
في هذه الحالة).
بخلاف ذلك ، فإن السبب الوحيد الذي يجعل مثالك لا يعمل هو استخدام "2" (ربما كما لو كان الحد الأقصى للحشو للتطبيق) عندما يكون "3" (كما في مثالي) لأن هذه القيمة هي المجموع الناتج العرض (وليس عرض الوسادة فقط).
نصائح أخرى
إذا كان نظامك يحتوي عليه ، فحاول seq
مع ال -w
(--equal-width
) اختيار:
$ seq -s, -w 1 10
01,02,03,04,05,06,07,08,09,10
$ for i in `seq -w 95 105` ; do echo -n " $i" ; done
095 096 097 098 099 100 101 102 103 104 105
في الإصدار 4 (استخدم Bash -Version) يمكنك استخدامه توسيع الدعامة. وضع 0
قبل أي من الحد الأقصى ، يتم تجهيز الأرقام بواسطة الأصفار
echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...
#!/bin/bash
max=100;
for ((i=1;i<=$max;i++)); do
printf "%0*d\n" ${#max} $i
done
سيقوم الرمز أعلاه بداحة أرقامك بالرقم الصحيح من 0 استنادًا إلى عدد الأرقام التي تحتوي عليها القيمة/الطرف المحترم. كل ما عليك فعله هو تغيير max
متغير وسوف يتعامل مع الباقي.
أمثلة:
كحد أقصى = 10
01
02
03
04
05
06
07
08
09
10
كحد أقصى = 100
001
002
003
004
005
006
...
097
098
099
100
كحد أقصى = 1000
0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000
# jot is available on FreeBSD, Mac OS X, ...
jot -s " " -w '%03d' 5
jot -s " " -w '%03d' 10
jot -s " " -w '%03d' 50
jot -s " " -w '%03d' 100
إذا كنت بحاجة إلى وضع القيم حتى رقم متغير مع حشوة متغيرة:
$values_count=514;
$padding_width=5;
for i in 0 `seq 1 $(($values_count - 1))`; do printf "%0*d\n" $padding_width $i; done;
هذا من شأنه أن يطبع 00000 ، 00001 ، ... 00513. (لم أجد أي من الإجابات الحالية تلبي حاجتي)