از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
فرمان Bash printf
سرفصلهای مطلب
هنگام نوشتن اسکریپت های Bash، еcho معمولاً برای چاپ با خروجی استاندارد استفاده می شود. در حالی که ساده و راحت است، echo
در قابلیت ها و کنترل قالب بندی محدود است.
برای کنترل بیشتر بر روی قالب بندی خروجی، از printf به جای آن دستور دهید.
را printf فرمان مشابه C عمل می کند printf() عملکرد و کنترل بیشتری روی قالب بندی به شما می دهد.
را printf فرمان
printf پوسته ای است که در Bash و سایر پوسته های محبوب مانند Zsh و Ksh ساخته شده است. مستقل نیز وجود دارد /usr/bin/printf باینری، اما نسخه داخلی پوسته اولویت دارد.
ما نسخه داخلی Bash را پوشش خواهیم داد printf.
نحو برای printf دستور به شرح زیر است:
printf [-v var] format [arguments...]
را -v گزینه می گوید printf نه به print خروجی اما اختصاص دادن آن به متغیر (var).
را format رشته ای است که ممکن است شامل سه نوع شیء مختلف باشد:
- کاراکترهای معمولی همانطور که هست در خروجی چاپ می شوند.
- کاراکترهای بک اسلش تفسیر شده و سپس چاپ می شوند.
- مشخصکنندههای تبدیل که قالب را توصیف میکنند و با مقادیر آرگومانهای مربوطه که دنبال رشته قالب هستند جایگزین میشوند.
arguments مقادیری هستند که جایگزین مشخص کننده ها در رشته قالب می شوند.
دستور هر تعداد از را می پذیرد arguments.
- اگر بیشتر
argumentsاز تعیین کننده های قالب ارائه شده استformatرشته برای مصرف همه آرگومان ها دوباره استفاده می شود. - اگر کمتر
argumentsنسبت به ارائه مشخصکنندههای قالب، مشخصکنندههای فرمت عددی اضافی روی مقدار صفر تنظیم میشوند، در حالی که مشخصکنندههای قالب رشتهای روی یک رشته تهی تنظیم میشوند.
در زیر چند نکته وجود دارد که باید هنگام انتقال آرگومان ها به آن توجه کرد printf دستور:
- پوسته همه متغیرها را گسترش میدهد، تطبیق حروف عام را انجام میدهد و کاراکترهای خاص را قبل از ارسال آرگومانها به
printfفرمان - هنگام استفاده از نقل قول تکی
''، ارزش تحت اللفظی هر کاراکتر محصور در نقل قول حفظ خواهد شد. متغیرها و دستورات گسترش نخواهند یافت.
بر خلاف echo، printf دستور به طور خودکار یک کاراکتر خط جدید اضافه نمی کند (\n) در انتهای خط. شما باید شامل شود \n به صراحت
یک نمونه معمولی از استفاده printf به نظر می رسد:
printf "Open issues: %s\nClosed issues: %s\n" "34" "65"
Open issues: 34
Closed issues: 65
رشته Open issues: %s\nClosed issues: %s\n است format، در حالی که “34” و “65” آرگومان هستند. رشته قالب شامل دو کاراکتر خط جدید (\n) و دو مشخص کننده فرمت (%s) که با آرگومان ها جایگزین می شوند.
بک اسلش فرار می کند
کاراکترهای بک اسلش زمانی که در رشته قالب یا آرگومان مربوط به %b مشخص کننده تبدیل در اینجا لیستی از رایج ترین شخصیت های فرار آورده شده است:
\\– نمایش یک کاراکتر بک اسلش.\b– یک کاراکتر بک اسپیس را نمایش می دهد.\n– یک خط جدید را نمایش می دهد.\r– بازگشت کالسکه را نمایش می دهد.\t– یک زبانه افقی را نمایش می دهد.\v– یک برگه عمودی را نمایش می دهد.
مشخص کننده های تبدیل
مشخصات تبدیل به شکل زیر است:
%[flags][width][.precision]specifier
هر مشخصات تبدیل با علامت درصد (%)، شامل اصلاح کننده های اختیاری است و با یکی از حروف زیر که نشان دهنده نوع داده (specifier) آرگومان مربوطه: aAbcdeEfgGioqsuxX.
تعیین کننده تبدیل تایپ کنید
تبدیل نوع specifier کاراکتری است که روش تفسیر آرگومان مربوطه را مشخص می کند. این کاراکتر الزامی است و بعد از فیلدهای اختیاری قرار می گیرد.
در زیر لیستی وجود دارد که تمام تبدیلهای نوع و کاری که انجام میدهند را نشان میدهد:
%b– آرگومان را همزمان با گسترش دنباله های فرار بک اسلش چاپ کنید.%q– چاپ آرگومان shell-quoted، قابل استفاده مجدد به عنوان ورودی.%d،%i– آرگومان را به صورت یک عدد صحیح اعشاری امضا شده چاپ کنید.%u– آرگومان را به صورت یک عدد صحیح اعشاری بدون علامت چاپ کنید.%o– آرگومان را به صورت یک عدد صحیح هشتگانه بدون علامت چاپ کنید.%x،%X– آرگومان را به صورت یک عدد صحیح هگزادسیمال بدون علامت چاپ کنید.%xحروف کوچک را چاپ می کند و%Xبا حروف بزرگ چاپ می کند%e،%E– آرگومان را به صورت یک عدد ممیز شناور در نماد نمایی چاپ کنید.%eحروف کوچک را چاپ می کند و%Eبا حروف بزرگ چاپ می کند%a،%A– آرگومان را به عنوان یک عدد ممیز شناور در نماد کسری هگزادسیمال چاپ کنید.%aحروف کوچک را چاپ می کند و%Aبا حروف بزرگ چاپ می کند%g،%G– آرگومان را به عنوان یک عدد ممیز شناور در نماد معمولی یا نمایی چاپ کنید، هر کدام که برای مقدار و دقت داده شده مناسب تر است.%gحروف کوچک را چاپ می کند و%Gبا حروف بزرگ چاپ می کند%c– آرگومان را به صورت یک کاراکتر چاپ کنید.%f– آرگومان را به عنوان یک عدد ممیز شناور چاپ کنید.%s– آرگومان را به صورت رشته ای چاپ کنید.%%– چاپ تحت اللفظی%نماد
یک عدد بدون علامت نشان دهنده اعداد صفر و مثبت است، در حالی که یک عدد علامت دار نشان دهنده اعداد منفی، صفر و مثبت است.
دستور زیر عدد 100 را در سه سیستم اعداد مختلف (چند پایه) چاپ می کند:
printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Decimal: 100
Hex: 64
Octal: 144
دستورالعمل پرچم ها
پرچم ها اولین اصلاح کننده های اختیاری هستند و برای تنظیم توجیه، صفرهای ابتدایی، پیشوندها و غیره استفاده می شوند.
در اینجا رایج ترین آنها هستند:
-– متن چاپ شده را در قسمت چپ تراز کنید. به طور پیش فرض، متن به صورت راست تراز شده است.+– پیشوند اعداد با a+یا-علامت بزنید. به طور پیش فرض، فقط اعداد منفی با علامت منفی پیشوند می شوند.0– اعداد را با صفرهای ابتدایی به جای فاصله قرار دهید.- خالی
– پیشوند اعداد مثبت را با یک فضای خالی و اعداد منفی را با منهای (-). #– یک قالب جایگزین
برای اعداد
بخشنامه عرض
را width فیلد دستورالعمل که بعد از هر کاراکتر پرچم قرار می گیرد، حداقل تعداد کاراکترهایی را که تبدیل باید تولید کند را مشخص می کند.
اگر عرض متن خروجی کمتر از عرض مشخص شده باشد، با فاصله پر می شود. عرض را می توان به عنوان یک عدد صحیح اعشاری غیر منفی یا یک ستاره (*).
در اینجا یک مثال است:
printf "%20s %d\n" Mark 305
%20s یعنی فیلد را حداقل 20 کاراکتر تنظیم کنید. جاهای خالی قبل از متن اضافه می شوند زیرا، به طور پیش فرض، خروجی درست توجیه می شود. برای تراز کردن متن در سمت چپ، از - پرچم (%-20s).
Mark 305
وقتی یک ستاره (*) به عنوان a استفاده می شود width دستورالعمل، سپس عرض فیلد تبدیل توسط یک آرگومان عرض که قبل از آرگومان در حال قالب بندی قرار می گیرد، تنظیم می شود.
در مثال زیر، عرض را روی 10 قرار می دهیم:
printf "%0*d" 10 5
0 پرچمی است که عدد را با صفرهای ابتدایی به جای خالی قرار می دهد. متن خروجی حداقل 10 کاراکتر خواهد داشت:
0000000005
دستورالعمل دقیق
را .precision اصلاح کننده از یک نقطه (.) به دنبال آن یک عدد صحیح یا ستاره مثبت (*) که بسته به روی نوع مشخص کننده، تعداد کاراکترهای رشته یا رقمی یا تعداد ارقام اعشاری را برای چاپ تنظیم می کند.
دقت اثر زیر را دارد:
- اگر نوع تبدیل یک عدد صحیح باشد، دقت حداقل تعداد ارقامی را که باید چاپ شود را مشخص می کند. اگر تعداد ارقام آرگومان کمتر از دقت باشد، صفرهای ابتدایی چاپ می شوند.
- اگر نوع تبدیل ممیز شناور باشد، دقت تعداد ارقام بعد از نقطه اعشار را مشخص می کند. دقت پیش فرض 6 است.
- اگر نوع تبدیل یک رشته باشد، دقت حداکثر تعداد کاراکترهایی که باید چاپ شوند را مشخص می کند. اگر تعداد کاراکترهای آرگومان بیشتر از دقت باشد، کاراکترهای اضافی کوتاه میشوند.
در اینجا یک مثال نشان می دهد که چگونه یک عدد ممیز شناور را به 3 اعشار گرد کنید:
printf "%.3f" 1.61803398
1.618
وقتی دقت روی ستاره تنظیم می شود (*، مقدار آن توسط آرگومان دقیقی که قبل از آرگومان در حال قالب بندی قرار می گیرد، تنظیم می شود.
printf "%.*f" 3 1.61803398
1.618
نکات کاربردی
- همیشه از نقل قول ها در اطراف رشته قالب استفاده کنید تا از globbing ناخواسته یا گسترش متغیر جلوگیری کنید.
- نقل قولهای تک را برای قالبهای تحت اللفظی ترجیح دهید، مگر اینکه به بسط متغیر در خود قالب نیاز داشته باشید.
نتیجه گیری
را printf دستور buildin یک جایگزین قدرتمند و قابل پیش بینی برای echo. فرمت و آرگومان می گیرد و خروجی تمیز، تراز و حرفه ای را چاپ می کند.
اگر سوال یا بازخوردی دارید، در کامنت بگذارید.
terminal
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1404-12-10 17:46:07

