پرسش و پاسخ شماره ۶۷ - آموزش اسکریپت نویسی
X
تبلیغات
رایتل

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

#!/bin/bash

پرسش و پاسخ شماره ۶۷

پرسش و پاسخ شماره ۶۷

چطور می‌توانم فضای سفید قبل یا بعد یکی از متغیرهایم را پاک کنم؟

برای انجام این کار چند راه وجود دارد. بعضی از از این روشها ترفندهای خاصی را شامل می‌گردند که فقط با فضای سفید کار می‌کنند. برخی دیگر بیشتر عمومیت دارند، و می‌توانند برای جدا کردن صفرها به کار بروند، و غیره.

در اینجا یکی از آنها که فقط برای فضاهای سفید کار می‌کند، آمده است. این کُد بر این واقعیت تکیه دارد که readدر صورتی که IFS برقرار نشده باشد، تمام فضاهای سفید ابتدا و انتها را پاک می‌کند:

   # POSIX اما در صورتیکه متغیر شامل سطرجدید باشد شکست می‌خورد
   read -r var << EOF
   $var
   EOF

Bash می‌تواند کار مشابهی را با یک "here string" انجام بدهد:

   # Bash
   read  -rd '' x <<< "$x"

استفاده از یک رشته تهی به عنوان جداکننده به معنی آن است که read تمام آن رشته را از بین می‌برد، به طوریکه NUL استفاده می‌شود. (به خاطر بیاورید: BASH فقط متغیرهای رشته‌ای C به کار می‌برد.) این برای هر متنی ازجمله شامل سطرجدید مطمئن است.

این هم راه حلی با استفاده از extglob و بسط پارامتر همراه با یکدیگر:

   # Bash
   shopt -s extglob
   x=${x##+([[:space:]])} x=${x%%+([[:space:]])}

همچنین این روش در پوسته Korn بدون ضرورت تنظیم صریح extglob کار می‌کند:

   # ksh
   x=${x##+([[:space:]])} x=${x%%+([[:space:]])}

این روش آنطور که چند روش اول بودند، محدود به فضاهای سفید نیست. بعلاوه، صفرهای مقدم را می‌توانید حذف کنید:

   # Bash
   shopt -s extglob
   x=${x##+(0)}

روش دیگری در bash برای حذف صفرهای مقدم بر عدد، رفتار کردن با آنها به عنوان عدد صحیح در یک زمینه محاسباتی است:

   # Bash
   x=$((10#$x))
   # شامل هرچیز دیگری غیر از رقم باشد این روش ناموفق است x ،هر چند اگر

اگر در پوسته POSIX نیاز به پاک کردن صفرهای مقدم دارید، می‌توانید یک حلقه به کار ببرید:

   # POSIX
   while true; do
     case "$var" in
       0*) var=${var#0};;
       *)  break;;
     esac
   done

یا این ترفند( با تفصیل بیشتر در پرسش و پاسخ شماره 100 پوشش داده شده):

   # POSIX
   zeroes=${var%%[!0]*}
   var=${var#$zeroes}

بسیار بسیار روشهای دیگری برای انجام این کار وجود دارد، برای نمونه استفاده از sed:

   # POSIX, فضاهای سفید اول و انتهای هر سطر را موقوف می‌کند
   x=$(echo "$x" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')

برای بریدن زوائد فایلهای بزرگ ، راه حل‌های مبتنی بر برنامه‌های خارجی مانند sed بیشتر از متغیرهای پوسته مناسب می‌باشند.


پرسش و پاسخ 67 (آخرین ویرایش ‎ 2011-06-21 15:20:23‎ توسط GreyCat)