في باش ، كيف يمكنني إضافة أعداد صحيحة مع الأصفار الرائدة والحفاظ على مخزن مؤقت محدد

StackOverflow https://stackoverflow.com/questions/3191067

  •  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. (لم أجد أي من الإجابات الحالية تلبي حاجتي)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top