کاراکترهای خاص

فصل 3- کاراکترهای خاص

چه چیزی یک کاراکتر را خاص می‌کند؟ در صورتیکه کاراکتری فراتر از مصداق لفظی‌اش، دارای یک مفهوم فوقانی باشد، آنوقت ما به عنوان یک کاراکتر خاص به آن اشاره می‌کنیم. کاراکترهای خاص همراه با فرمان‌ها و کلیدواژه‌ها، قطعات اسکریپت‌های Bash را می‌سازند.

کاراکترهای ویژه به کار رفته در اسکریپت‌ها و جاهای دیگر

1. #

Comments. سطرهایی که با یک کاراکتر # شروع می‌شوند (به استثنای ‎#!‎) توضیح هستند و در نظر گرفته نخواهند شد.

#‎

همچنین ممکن است توضیحات متعاقب انتهای یک فرمان قرار بگیرند.

echo "A comment will follow." #                 
#‎

توضیحات همچنین ممکن است بعد از فضای سفید ابتدای یک سطر قرار گیرند.

توضیحات حتی ممکن است در داخل یک لوله جاسازی بشوند.

initial=( `cat "$startfile" | sed -e '/#/d' | tr -d '\n' |\
#
           sed -e 's/\./\. /g' -e 's/_/_ /g'` )
#

Caution

بعد از توضیح، قرار گرفتن یک فرمان در همان سطر میسر نیست. هیچ شیوه صحیح برای خاتمه دادن توضیح به منظور شروع «کد مؤثر» در همان سطر، وجود ندارد. برای فرمان بعدی از یک سطر جدید استفاده کنید.


البته، یک # نقل‌قول‌شده یا معاف شده در یک دستور echo یک توضیح را شروع نمی‌کند. همچنین، کاراکتر # در برخی ساختارهای جایگزینی پارامتر و در عبارت‌های ثابت عددی نیز ظاهر می‌گردد.
echo "The # here does not begin a comment."
echo 'The # here does not begin a comment.'
echo The \# here does not begin a comment.
echo The #

echo ${PATH#*:}       #
echo $(( 2#101011 ))  #      ‎

# با تشکر از ‎S.C.‎
کاراکترهای استاندارد نقل‌قول و گریز ‎(" ' \)‎ کاراکتر # را (مترجم: از معنای خاص آن) معاف می‌کنند.

برخی عملیات انطباق الگو نیز # را به کار می‌برند.

2. ;

جداکننده فرمان ‎[semicolon]‎. قرار دادن دو یا چند فرمان در همان سطر را مجاز می‌سازد.

echo hello; echo there


if [ -x "$filename" ]; then    #
#+
  echo "File $filename exists."; cp $filename $filename.bak
else   #
  echo "File $filename not found."; touch $filename
fi; echo "File test complete."

توجه نمایید که کاراکتر «;» گاهی اوقات لازم است معاف(escaped) بشود.

3. ;;

خاتمه‌دهنده در یک گزینه case [سمی‌کالن دوتایی].

case "$variable" in
  abc)  echo "\$variable = abc" ;;
  xyz)  echo "\$variable = xyz" ;;
esac

4. ‎;;&‎ و ‎;&‎

خاتمه‌دهنده در یک گزینه case ‏(Bash نگارش ‎4+‎ ).

5. .

فرمان «dot» [نقطه]. معادل با source ( مثال ‎15-22‎ را ببینید). این یک builtin پوسته bash است.

6. .

«dot»، به عنوان بخشی از یک نام فایل. موقع کار با نام‌فایل‌ها، یک نقطه پیشتاز در نام، شاخص یک فایل «پنهان» است، فایلی که به طور معمول یک ls آن را نمایش نخواهد داد.

bash$ touch .hidden-file
bash$ ls -l	      
total 10
-rw-r--r--    1 bozo      4034 Jul 18 22:04 data1.addressbook
-rw-r--r--    1 bozo      4602 May 25 13:58 data1.addressbook.bak
-rw-r--r--    1 bozo       877 Dec 17  2000 employment.addressbook

bash$ ls -al
total 14
drwxrwxr-x    2 bozo  bozo      1024 Aug 29 20:54 ./
drwx------   52 bozo  bozo      3072 Aug 29 20:51 ../
-rw-r--r--    1 bozo  bozo      4034 Jul 18 22:04 data1.addressbook
-rw-r--r--    1 bozo  bozo      4602 May 25 13:58 data1.addressbook.bak
-rw-r--r--    1 bozo  bozo       877 Dec 17  2000 employment.addressbook
-rw-rw-r--    1 bozo  bozo         0 Aug 29 20:54 .hidden-file

موقع بررسی نام دایرکتوری‌ها، یک نقطه منفرد، دایرکتوری کاری جاری را نمایندگی می‌کند، و دو نقطه به معنی دایرکتوری والد است.

bash$ pwd
/home/bozo/projects
bash$ cd .
bash$ pwd
/home/bozo/projects
bash$ cd ..
bash$ pwd
/home/bozo/

کاراکتر dot بیشتر اوقات به عنوان مقصد (دایرکتوری) یک فرمان جابجایی فایل ظاهر می‌گردد، در این مضمون به معنای دایرکتوری جاری است.

bash$ cp /home/bozo/current_work/junk/* .
کپی تمام فایل‌های دایرکتوری «junk» به ‎$PWD.

7. .

کاراکتر انطباق «dot». موقع انطباق کاراکترها، به عنوان بخشی از یک عبارت منظم، یک «نقطه» با یک کاراکتر منفرد منطبق می‌گردد.

8. "

نقل‌قول نیمه کامل [نقل‌قول دوگانه]. "STRING" اکثر کاراکترهای خاص در داخل STRING را معاف (از تفسیر) می‌کند. فصل 5 را ببینید.

9. '

نقل‌قول کامل [نقل‌قول منفرد]. ‎'STRING'‎ تمام کاراکترهای خاص درون STRING را معاف می‌کند. این یک شکل قوی‌تر از نقل‌قول ‎"STRING"‎ است. فصل 5 را ببینید.

10. ,

عملگر کاما. عملگر کاما‎[1]‎ یک گروه از عملیات محاسباتی را به یکدیگرمتصل می‌کند. تمام عملکردها ارزیابی می‌شوند اما فقط آخرین عمل برگشت داده می‌شود.

let "t2 = ((a = 9, 15 / 3))"
#‎

عملگر comma همچنین می‌تواند رشته‌ها را بهم پیوست نماید.

for file in /{,usr/}bin/*calc
#
#+
do
        if [ -x "$file" ]
        then
          echo $file
        fi
done

#
#
#
#


#‎

11. ,,  ,

تبدیل به حرف کوچک در جایگزینی پارامتر (اضافه شده در نگارش 4 از Bash).

12. \

گریز ‎[backslash]‎. یک ساز و کار نقل‌قول برای یک کاراکتر منفرد.

‎\X‎ کاراکتر X رامعاف می‌کند. این مورد دارای همان تاثیر «نقل‌قول» X است، و معادل ‎'X'‎ می‌باشد. کاراکتر \ می‌تواند جهت نقل‌قول " و ' برای این‌که آنها به طور لفظی بیان گردند، به کار برود.

برای یک توضیح دقیق و عمیقِ کاراکترهای معاف شده، فصل 5 را ملاحظه نمایید.

13. /

جداکننده مسیر نام فایل ‎[forward slash]‎. اجزا تشکیل‌دهنده نام فایل (همچون در ‎/home/bozo/projects/Makefile‎) را تفکیک می‌کند.

این کاراکتر همچنین عملگر تقسیم حسابی است.

14. `

جایگزینی فرمان. ساختار ‎`command`‎ تخصیص خروجی command به یک متغیر را مقدور می‌سازد. این کاراکتر نقل‌قول برعکس یا backtick نیز نامیده می‌شود.

15. :

فرمان پوچ ‎[colon]‎. این معادل ‎"NOP"‎ ‏(‎no op‎، یک عملگر هیچ‌کاره) است. می‌تواند به عنوان یک مترادف برای دستور داخلی true پوسته در نظر گرفته شود. فرمان : خودش نیز یک builtin پوسته Bash است، و وضعیت خروج آن true ‎(0)‎ است.

:
echo $?   #

حلقه بی‌پایان:

while :
do
   operation-1
   operation-2
   ...
   operation-n
done

#
#
#
#
#

جای‌نگهدارنده در آزمون ‎if/then‎ :

if condition
then :   #
else     #               
   take-some-action
fi

فراهم نمودن یک جای‌نگهدار در جایی که یک عملیات دوگانی انتظار می‌رود، مثال ‎8-2‎ و پارامترهای پیش‌فرض را ببینید.

: ${username=`whoami`}
  #         ‎${username=`whoami`}‎ بدون : مقدم، یک خطا نمایش می‌دهد‎
  #           

: ${1?"Usage: $0 ARGUMENT"}  #‎

فراهم کردن یک جای‌نگهدارنده، آنجا که در یک here document یک فرمان مورد انتظار است. مثال ‎19-10‎ را ببینید.

ارزیابی رشته متغیرها با استفاده از جایگزینی پارامتر (همچون در مثال ‎10-7‎).

: ${HOSTNAME?} ${USER?} ${MAIL?}

بسط متغیر - تعویض زیررشته .

در ترکیب با عملگر تغییرمسیر ‎>‎، یک فایل را بدون تغییر مجوزهایش به طول صفر کوتاه می‌کند (مترجم: فایل را تهی می‌سازد). اگر فایل از قبل موجود نباشد، آن را ایجاد می‌کند

: > data.xxx     #           

#
#      

همچنین مثال ‎16-15‎ را ببینید.

در ترکیب با عملگر تغییرمسیر ‎>>‎ ، تاثیری در فایل مقصد از قبل موجود ندارد ‎(: >> target_file)‎. اگر فایل از قبل وجود نداشته باشد آن را ایجاد می‌کند.

این روی فایل‌های معمولی اِعمال می‌شود، برای لوله‌ها، پیوندهای نمادین، و فایل‌های خاص صدق نمی‌کند.

می‌تواند برای شروع کردن یک سطر توضیح به کار برود، اگرچه این کار پیشنهاد نمی‌گردد. به کار بردن # برای یک توضیح، کنترل خطا برای بقیه آن سطر را خاموش می‌کند، بنابراین تقریباً هر موردی می‌تواند در یک توضیح به چشم بخورد. اما، در مورد : این حالت صادق نیست.

: این یک توضیح است که یک خطا تولید می‌کند ‎( if [ $x -eq 3] )‎

کاراکتر : به عنوان یک جداکننده فیلد در فایل ‎/etc/passwd‎، و در متغیر ‎$PATH‎ به کار می‌رود.

bash$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games

یک colon به عنوان نام یک تابع قابل‌قبول است.

:()
{
  echo "The name of this function is "$FUNCNAME"
 #
 #                  
}

:

 #                          

این یک رفتار قابل حمل نیست، و بنابراین یک رویه توصیه شده نیست. در حقیقت، نگارش‌های جدیدتر Bash این کاربرد را اجازه نمی‌دهند. با وجود این، یک underscore (خط زیر) _ کار می‌کند.

یک colon می‌تواند به عنوان جای‌نگهدارنده در تابع پوچ غیر تهی نیز خدمت کند.

not_empty ()
{
  :
}   # ‎

16. !

[bang] مفهوم یک آزمون یا وضعیت خروج را برعکس (یا منفی) می‌کند. عملگر ! وضعیت خروج فرمانی را که بر آن اِعمال می‌گردد وارونه می‌سازد (مثال ‎6-2‎ را ببینید). همچنین، معنی عملگر تست را برعکس می‌کند. برای مثال، این عملگر می‌تواند مفهوم مساوی ‎( = )‎ را به نامساوی ‎( != )‎تغییر بدهد. عملگر ! یک کلمه‌کلیدی Bash است.

در یک مضمون متفاوت، ! در ارجاع‌های متغیر غیر مستقیم نیز ظاهر می‌شود.

باز هم در یک مضمون دیگر، عملگر ! از خط فرمان، ساز و کار تاریخچه Bash را احضار می‌کند( پیوست ‎L‎ را ببینید). توجه نمایید که در داخل اسکریپت، ساز و کار تاریخچه غیر فعال است.

17. *

کاراکتر عام [ستاره]. کاراکتر * به عنوان یک «کاراکتر عام» برای بسط نام‌فایل در globbing به کار می‌رود. خودش به تنهایی با هر نام فایل در دایرکتوری جاری منطبق می‌گردد.

bash$ echo *
abs-book.sgml add-drive.sh agram.sh alias.sh

همچنین در یک عبارت منظم کاراکتر * هر تعداد (یا صفر) کاراکتر را نمایندگی می‌کند.

18. *

عملگر حسابی. در متن عملیات حسابی، کاراکتر * علامت ضرب است.

** یک زوج ستاره می‌تواند نماینده عملگر به توان رساندن یا globbing انطباق فایل توسعه یافته باشد.

19. ?

عملگر test. داخل برخی عبارت‌ها، کاراکتر ? نشان دهنده یک بررسی برای یک شرط است.

در یک ساختار پرانتز دوتایی، کاراکتر ? می‌تواند به عنوان یک عضو عملگر trinary (سه‌گانه) سبکِ-C به کار برود.‎[2]‎

condition?result-if-true:result-if-false

(( var0 = var1<98?9:21 ))
#

#
#
#
#
#
#

در یک عبارت جایگزینی پارامتر، کاراکتر ?بررسی می‌کند که آیا یک متغیر تنظیم شده است.

20. ?

کاراکتر عام. کاراکتر ‎?‎ به عنوان یک کاراکتر منفرد «کاراکتر عام» در globbing، و همچنین نمایندگی یک کاراکتر در یک عبارت منظم توسعه‌یافته به کار می‌رود.

21. $

جایگزینی متغیر (محتویات یک متغیر).

var1=5
var2=23skidoo

echo $var1     #
echo $var2     #

یک $ پیشوند شده به نام یک متغیر بیانگر مقداری است که متغیر نگهداری می‌کند.

22. $

انتهای سطر. در یک عبارت منظم، یک $ انتهای سطر در متن را آدرس‌دهی می‌کند.

23. ‎${}‎
24. ‎$' ... '‎

بسط رشته نقل‌قولی. این ساختار مقادیر هگزا یا اکتال منفرد یا چندگانه escap شده را به ‎ASCII [3]‎ یا کاراکترهای Unicode بسط می‌دهد.

25. ‎$*‎, ‎$@‎
26. ‎$?‎

متغیر وضعیت خروج. متغیر ‎‎$?‎ نگهدارنده وضعیت خروجِ یک فرمان، یک تابع، یا وضعیت خروج خود اسکریپت می‌باشد.

27. $$

متغیر ID پردازش. متغیر $$ شماره شناسایی پردازش ‎[4]‎ اسکریپتی را که در آن حضور می‌یابد نگهداری می‌کند.

28. ()

گروه فرمان.

(a=hello; echo $a)

important

لیستی از فرمانها در درون پرانتزها، یک پوسته فرعی را شروع می‌کند.

متغیرهای داخل پرانتزها، داخل پوسته فرعی، در بقیه اسکریپت قابل مشاهده نیستند. پردازش والد یعنی اسکریپت، نمی‌تواند متغیرهای تولید شده در پردازش فرزند، یعنی پوسته فرعی، را بخواند.

a=123
( a=321; )	      

echo "a = $a"   #
#‎

مقداردهی آرایه.

Array=(element1 element2 element3)

29. ‎{xxx,yyy,zzz,...}‎

بسط ابرو.

echo \"{These,words,are,quoted}\"    #    
 #                                        


cat {file1,file2,file3} > combined_file
 #

cp file22.{txt,backup}   #  ‎

یک فرمان می‌تواند روی لیستی از مشخصه‌های فایل در درون ابروها که با کاما از یکدیگر جدا شده‌اند، عمل نماید. ‎[5]‎ بسط نام فایل ‎(globbing)‎ بر مشخصه‌های فایل میان ابروها اعمال می‌گردد.

Caution

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

echo {file1,file2}\ :{\ A," B",' C'}

file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C

30. {a..z}

بسط ابروی توسعه‌یافته.

echo {a..z} #   
            #                       

echo {0..3} #                    
            #                    


base64_charset=( {A..Z} {a..z} {0..9} + / = )
            #
            #              

ساختار ‎{a..z}‎ بسط ابروی توسعه‌یافته، یک ویژگی معرفی شده در نگارش 3 پوسته Bash است.

31. {}

قطعه کد [bracketهای کمان شکل]. به عنوان یک گروه درون‌برنامه‌ای نیز به آنها اشاره می‌شود، این ساختار، در عمل، یکتابع ناشناس (یک تابع بدون نام) ایجاد می‌کند. اگرچه، برخلاف یک تابع «استاندارد»، متغیرهای داخل یک قطعه کد برای باقیمانده اسکریپت قابل رویت می‌مانند.

bash$ { local a;
   a=123; }
bash: local: can only be used in a function

a=123
{ a=321; }
echo "a = $a"   #

#

ممکن است به قطعه کد محصور شده در ابروها یا از آن، تغییر مسیر I/O صورت بگیرد.

مثال ‎3-1‎. قطعه‌های کد و تغییر مسیر I/O

#!/bin/bash
# خواندن سطرهای فایل ‎/etc/fstab‎

File=/etc/fstab

{
read line1
read line2
} < $File

echo "First line in $File is:"
echo "$line1"
echo
echo "Second line in $File is:"
echo "$line2"

exit 0

#
#                  
#

مثال ‎3-2‎. ذخیره خروجی یک قطعه کد در یک فایل

#!/bin/bash
#

# 
#+         
#          
# 
#

SUCCESS=0
E_NOARGS=65

if [ -z "$1" ]
then
  echo "Usage: `basename $0` rpm-file"
  exit $E_NOARGS
fi  

{                   # 
  echo
  echo "Archive Description:"
  rpm -qpi $1       # 
  echo
  echo "Archive Listing:"
  rpm -qpl $1       #  
  echo
  rpm -i --test $1  #         
  if [ "$?" -eq $SUCCESS ]
  then
    echo "$1 can be installed."
  else
    echo "$1 cannot be installed."
  fi  
  echo              #
} > "$1.test"       #

echo "Results of rpm test in file $1.test"

                    # 

exit 0

برخلاف درون یک گروه فرمان (پرانتزها)، یک قطعه کد محصور شده در {ابروها} مانند مثال فوق، معمولاً یک پوسته فرعی راه‌اندازی نخواهد کرد. ‎[6]‎

تکرار کردن یک قطعه کد با استفاده از حلقه for غیر استاندارد امکان‌پذیر است.(مترجم: بدون نیاز به کلیدواژه‌های do , done)

32. ‎{}‎

placeholder برای متن. استفاده شده بعد از ‎xargs ‎-i‎‎ (تعویض رشته‌ها). ابروهای دوتایی ‎{}‎ یک جای‌نگهدار برای متن خروجی هستند.

ls . | xargs -i -t cp ./{} $1
#

#

33. ‎{} \;‎

نام مسیر. بیشتر در ساختارهای find به کار رفته است. این یک دستور داخلی پوسته نیست.

کاراکتر ; گزینه ‎-exec‎ رشته فرمان find را خاتمه می‌دهد. به منظور محافظت آن از تفسیر شدن توسط شل، لازم است escaped(معاف از تفسیر) بشود.
34. ‎[ ]‎

test.

بررسی عبارت درون ‎[ ]‎. توجه نمایید که ‎[‎ جزء مساوی با فرمان داخلی test پوسته است (و یک مترادف برای آن است)، نه یک پیوند به فرمان خارجی ‎/usr/bin/test‎

35. ‎[[ ]]‎

test.

بررسی عبارت میان ‎[[ ]]‎. با قابلیت انعطافی بیش از بررسی ‎[ ]‎، این یک کلمه‌کلیدی پوسته است.

گفتگو در مورد ساختار [[ ... ]]‎ را ملاحظه کنید.

36. ‎[ ]‎

عضو آرایه.

در مضمون یک آرایه، bracketها شماره هر یک از عناصر آن آرایه را احاطه می‌کنند.

Array[1]=slot_1
echo ${Array[1]}

37. ‎[ ]‎

حدود کاراکترها.

به عنوان قسمتی از یک عبارت منظم، bracketها محدوده کاراکترها جهت مطابقت دادن را مشخص می‌کنند.

38. ‎$[ ... ]‎

بسط عدد صحیح.

ارزیابی عبارت صحیح میانِ ‎$[ ]‎.

a=3
b=7

echo $[$a+$b]   
echo $[$a*$b]   

توجه داشته باشید که این کاربرد نکوهش گردیده است، و با ساختار ‎(( ... ))‎ جایگزین شده است.

39. ‎(( ))‎

بسط عدد صحیح.

بسط و ارزیابی عبارت صحیح میان ‎(( ))‎.

بحث در باره ساختار ‎(( ... ))‎ را ببینید.

40. ‎>‎ ‎&>‎ ‎>&‎ ‎>>‎ ‎<‎ ‎<>‎

‎scriptname >filename‎ خروجیscriptname را به فایل filename تغییر مسیر می‌دهد. اگر filename از قبل موجود باشد آن را رونویسی می‌کند.

‎command &>filename‎ هر دو مورد stdout و stderr مربوط به command را به filename تغییر مسیر می‌دهد.

این تغییر مسیر هنگام بررسی یک شرط، برای خنثی کردن خروجی مفید است . برای مثال، بیایید بررسی کنیم که آیا یک فرمان معین، موجود است.

bash$ type bogus_command &>/dev/null

bash$ echo $?
1

یا در یک اسکریپت:

command_test () { type "$1" &>/dev/null; }
#

cmd=rmdir                    # 
command_test $cmd; echo $?   #


cmd=bogus_command            #
command_test $cmd; echo $?   #

‎command >&2‎ خروجی استاندارد command را به stderr تغییر مسیر می‌دهد.

‎scriptname >>filename‎ خروجی استاندارد scriptname را به فایلِ filename پیوست می‌نماید. در صورتیکه filename از قبل موجود نباشد، ایجاد می‌گردد.

‎[i]<>filename‎ فایل filename را برای خواندن و نوشتن باز می‌کند، و توصیف‌گر فایل i را به آن تخصیص می‌دهد. اگر filename موجود نباشد، ایجاد می‌گردد.

‎(command)>‎

‎<(command)‎

در یک مضمون متفاوت، کاراکترهای ‎<‎ و ‎>‎ به عنوان عملگرهای مقایسه رشته عمل می‌کنند.

در یک زمینه دیگر، کاراکترهای ‎<‎ و ‎>‎ به عنوان عملگرهای مقایسه عدد صحیح رفتار می‌نمایند. همچنین مثال ‎16-9‎ را ملاحظه کنید.

41. ‎<<‎

تغییر مسیر مورد استفاده در یک here document.

42. ‎<<<‎

تغییر مسیر به کار رفته در یک here string.

43. ‎<‎ , ‎>‎

مقایسه ASCII.

veg1=carrots
veg2=tomatoes

if [[ "$veg1" < "$veg2" ]]
then
  echo "Although $veg1 precede $veg2 in the dictionary,"
  echo -n "this does not necessarily imply anything "
  echo "about my culinary preferences."
else
  echo "What kind of dictionary are you using, anyhow?"
fi

44. ‎\<‎ , ‎\>‎

bash$ grep '\<the\>' textfile

45. |

pipe. خروجی استاندارد‎(stdout)‎ فرمان قبل را به ورودی استاندارد ‎(stdin)‎ فرمان بعد، یا به پوسته عبور می‌دهد. این روشی برای زنجیر کردن فرمانها با یکدیگر است.

echo ls -l | sh
#
#+ 


cat *.lst | sort | uniq
#‎

خروجی یک یا چند فرمان می‌تواند به یک اسکریپت لوله‌کشی بشود.

#!/bin/bash
#

tr 'a-z' 'A-Z'
#

exit 0
اکنون بیایید خروجی ‎ls -l‎ را به این اسکریپت لوله‌کشی کنیم.
bash$ ls -l | ./uppercase.sh

-RW-RW-R--    1 BOZO  BOZO       109 APR  7 19:49 1.TXT
-RW-RW-R--    1 BOZO  BOZO       109 APR 14 16:48 2.TXT
-RW-R--R--    1 BOZO  BOZO       725 APR 20 20:56 DATA-FILE

stdout هر پردازش یک لوله باید به عنوان stdin پردازش بعدی خوانده شود. در صورتیکه این حالت نباشد، جریان داده‌ها مسدود خواهد گردید، و لوله آنطور که انتظار می‌رود عمل نخواهد نمود.
cat file1 file2 | ls -l | sort
#‎

یک لوله به عنوان یک پردازش فرزند اجرا می‌گردد، و بنابراین نمی‌تواند متغیرهای اسکریپت را تغییر بدهد.

variable="initial_value"
echo "new_value" | read variable
echo "variable = $variable"     #

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

46. ‎>|‎

اجبار به تغییر مسیر (حتی اگر گزینه noclobber تنظیم شده باشد). این عملگر باعث رونویسی اجباری فایل می‌گردد.

47. ||

عملگر منطقی or. در یک ساختار test، عملگر || در صورتیکه که هریک از شرط‌های بررسی متصل شده با این عملگر صحیح باشد، موجب برگشت دادن یک صفر (موفقیت) خواهد شد.

48. ‎&‎

اجرای job در پس‌زمینه. یک فرمان دنبال شده با یک ‎&‎ در پس‌زمینه اجرا خواهد گردید.

bash$ sleep 10 &
[1] 850
[1]+  Done                    sleep 10

در داخل یک اسکریپت، فرمانها و حتی حلقه‌ها می‌توانند در پس‌زمینه اجرا بشوند.

مثال ‎3-3‎. اجرای یک حلقه در پس‌زمینه

#!/bin/bash
#

for i in 1 2 3 4 5 6 7 8 9 10              #  
do
  echo -n "$i "
done &   #             
         #

echo     # 

for i in 11 12 13 14 15 16 17 18 19 20     #  
do
  echo -n "$i "
done  

echo     # 

#

#                        
#
#

#      
#
#
#                    

#                                       
#
#                    

#                             
#
#         

exit 0

#
#+

Caution

در داخل یک اسکریپت، فرمان اجرا شده در پس‌زمینه ممکن است در انتظار یک ضربه کلید متوقف بشود. خوشبختانه، یک راه گریز برای این مورد موجود است.

49. ‎&&‎

عملگر منطقی and. در یک ساختار test ، عملگر ‎&&‎ فقط اگر هر دو شرط بررسی متصل‌شده توسط این عملگر صحیح باشند، باعث برگشت دادن یک 0 (موفقیت) می‌گردد.

50. -

گزینه، پیشوند. نشانه گزینه برای فرمان یا فیلتر. پیشوند برای یک عملگر. پیشوند برای یک پارامتر قراردادی در جایگزینی پارامتر.

COMMAND -[Option1][Option2][...]

ls -al

sort -dfu $filename

if [ $file1 -ot $file2 ]
then   #
  echo "File $file1 is older than $file2."
fi

if [ "$a" -eq "$b" ]
then   #
  echo "$a is equal to $b."
fi

if [ "$c" -eq 24 -a "$d" -eq 47 ]
then   #
  echo "$c equals 24 and $d equals 47."
fi


param2=${param1:-$DEFAULTVAL}
       #

--

خط تیره دوتایی-- به گزینه‌های بلند (کلمه به کلمه) برای فرمانها پیشوند می‌شود.

sort --ignore-leading-blanks

در استفاده با یک فرمان داخلی Bash، به معنی انتهای گزینه‌ها برای آن فرمانِ بخصوص است.

tip

این مورد، وسیله سودمندی برای حذف فایلهایی که نام آنها با یک خط‌تیره شروع می‌گردد فراهم می‌نماید.

bash$ ls -l
-rw-r--r-- 1 bozo bozo 0 Nov 25 12:29 -badname

bash$ rm -- -badname

bash$ ls -l
total 0

خط‌تیره دوگانه همچنین در تلفیق با set هم به کار می‌رود.

‎set -- $variable‎ (همچون در مثال ‎15-18‎)

51. -

‎[dash]‎تغییر مسیر از stdin یا به stdout.

bash$ cat -
abc
abc

...

Ctl-D

به طوری که انتظار می‌رود، ‎cat -‎ ورودی استاندارد را بازتاب می‌دهد،در این حالت ورودی صفحه کلید کاربر را به stdout منعکس می‌کند. اما، آیا تغییر مسیر I/O با استفاده از - دارای کاربردهای عملی هست؟

(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)
#       
# [با احترام به Alan Cox <a.cox@swansea.ac.uk>, همراه یک تغییر جزیی‎]

#
#
#
#                       
#                                    
#
#
# 
# 
#
#                                              
#
#                                                
#
#                                      
#
#
#
#       
#      
#          
#
#
#
#                                                            



#                                  
#
#

#                             
#
#
#
#           

bunzip2 -c linux-2.6.16.tar.bz2 | tar xvf -
#
# 
# 
# 

توجه نمایید که در این مضمون کاراکتر - خودش یک عملگر Bash نیست، بلکه بیشتر یک گزینه شناسایی شده توسط برخی برنامه‌های سودمند UNIX است که در stdout می‌نویسند، از قبیل tar، cat، و غیره.

bash$ echo "whatever" | cat -
whatever 

جایی که یک نام فایل انتظار می‌رود، - خروجی را به stdout تغییر مسیر می‌دهد (گاهی اوقات با ‎tar cf‎ دیده شده)، یا ورودی را به جای یک فایل از stdin می‌پذیرد. این روشی برای به کار بردن یک برنامه سودمند فایل گرا به عنوان یک فیلتر در یک لوله است.

bash$ file
Usage: file [-bciknvzL] [-f namefile] [-m magicfiles] file...

file خودش در خط‌فرمان با یک پیغام خطا ناموفق میشود.

برای یک نتیجه مفیدتر یک - اضافه کنید. این موجب می‌گردد پوسته برای ورودی کاربر منتظر بماند.

bash$ file -
abc
standard input:              ASCII text


bash$ file -
#!/bin/bash
standard input:              Bourne-Again shell script text executable
اکنون فرمان file، ورودی را از stdin می‌پذیرد و آن را واکاوی می‌کند.

- می‌تواند برای لوله‌کشی stdout به سایر فرمانها به کار برود. این مطلب موارد جالبی مانند درج نمون سطرها در ابتدای یک فایل را میسر می‌سازد.

به کار بردن diff برای مقایسه یک فایل با یک بخش از یک فایل دیگر:

grep Linux file1 | diff file2 -

سرانجام یک مثال واقعی استفاده از - با tar.

مثال ‎3-4.‎ پشتیبان‌گیری از تمام فایلهایی که در آخرین روز تغییر یافته‌اند

#!/bin/bash

# ‎
#‎

BACKUPFILE=backup-$(date +%m-%d-%Y)
#‎
#‎
archive=${1:-$BACKUPFILE}
#‎
#‎

tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."

#                
#‎
#‎
#‎

#‎
#‎
#‎
#         


#‎
#
#‎


exit 0

Caution

نام فایلهایی که با - شروع می‌شوند وقتی با عملگر تغییر مسیر - جفت شوند، ممکن است باعث مشکلاتی بشوند. یک اسکریپت باید این مورد را بررسی نموده و یک پیشوند متناسب به این قبیل نام فایلها اضافه کند، به عنوان مثال ‎./-FILENAME‎‏، ‎$PWD/-FILENAME‎، یا ‎$PATHNAME/-FILENAME‎.

اگر مقدار یک متغیر با یک - شروع گردد، این نیز می‌تواند مشکلاتی ایجاد کند.

var="-n"
echo $var		
#

52. -

دایرکتوری کاری پیشین. یک فرمان ‎cd -‎ دایرکتوری را به دایرکتوری کاری قبلی تعویض می‌کند. در این حالت از متغیر محیطی ‎‎$OLDPWD‎‎ استفاده می‌شود.

Caution

- استفاده شده در این حالت را با عملگر تغییر مسیر - که اندکی قبل بحث شد، اشتباه نکنید. تفسیر کردن - به مضمونی که در آن ظاهر می‌شود بستگی دارد.

53. -

منها. علامت منها در یک عملیات حسابی.

54. =

تساوی. عملگر تخصیص

a=28
echo $a   #

در یک مضمون متفاوت، = یک عملگر مقایسه رشته است.

55. +

بعلاوه. عملگر حسابی جمع.

در یک زمینه متفاوت، + یک عملگر عبارت منظم است.

56. +

گزینه. نشانه گزینه برای یک فرمان یا فیلتر.

برخی فرمانها و builtinها از + برای فعال نمودن برخی گزینه‌ها و از - برای غیرفعال نمودن آنها استفاده می‌کنند. در جایگزینی پارامتر، + به یک مقدار علی‌البدل که متغیر به آن بسط می‌یابد پیشوند می‌گردد.

57. %

modulo. عملگر حسابی پیمانه‌ای(باقیمانده تقسیم).

let "z = 5 % 3"
echo $z  #

در یک مضمون دیگر، % یک عملگر انطباق الگو است.

58. ~

دایرکتوری خانه ‎[مَد]‎. این متناظر است با متغیر داخلی ‎$HOME‎. پس ‎~bozo‎ دایرکتوری خانگی bozo است و ‎ls ~bozo‎ محتویات آن را لیست می‌کند. و ‎~/‎ دایرکتوری خانگی کاربر جاری است، و ‎ls ~/‎ محتویات آن را لیست می‌کند.

bash$ echo ~bozo
/home/bozo

bash$ echo ~
/home/bozo

bash$ echo ~/
/home/bozo/

bash$ echo ~:
/home/bozo:

bash$ echo ~nonexistent-user
~nonexistent-user

59. ‎~+‎

دایرکتوری کاری جاری. این متناظر با متغیر داخلی ‎$PWD‎ است.

60. ‎~-‎

دایرکتوری کاری قبلی. این مورد متناظر با متغیر داخلی ‎$OLDPWD‎ است.

61. ‎=~‎

انطباق عبارت منظم. این عملگر با نگارش 3 پوسته Bash معرفی گردید.

62. ^

ابتدای سطر. در یک عبارت منظم، یک ^ به ابتدای سطر متن آدرس‌دهی می‌کند.

63. ^، ^^

تبدیل به حروف بزرگ در جایگزینی پارامتر (اضافه شده در نگارش 4 از Bash).

64. کاراکترهای کنترلی

تغییر رفتار ترمینال یا نمایش متن. یک کاراکتر کنترل عبارت است از ترکیب CONTROL + key (فشرده شده با یکدیگر). همچنین یک کاراکتر کنترل می‌تواند به صورت نشانه‌گذاری اکتال یا هگزادسیمال، به دنبال یک escape نوشته شود.

کاراکترهای کنترلی معمولاً داخل اسکریپت مورد استفاده نیستند.

  • ‎Ctl-A‎

    اشاره‌گر را به ابتدای سطرِ متن منتقل می‌کند (در خط فرمان).

  • ‎Ctl-B‎

    Backspace (غیر مخرب).

  • ‎Ctl-C‎

    Break. خاتمه دادن به job پیش‌زمینه.

  • ‎Ctl-D‎

    قطع اتصال از یک پوسته (مشابه با exit).

    EOF (انتهای فایل). همچنین ورودی از stdin را خاتمه می‌دهد.

    موقع تایپ متن در console یا در یک پنجره ‎xterm‎، ‏‎Ctl-D‎ کاراکتر زیر اشاره‌گر را پاک می‌کند. موقعی که کارکتری وجود نداشته باشد، ‎Ctl-D‎ به طوری که انتظار می‌رود از نشست جاری قطع اتصال می‌کند. در یک پنجره xterm، نتیجه این کاراکتر کنترلی، بستن پنجره است.

  • ‎Ctl-E‎

    اشاره‌گر را به انتهای سطر متن منتقل می‌کند (در خط فرمان).

  • ‎Ctl-F‎

    اشاره‌گر را یک کاراکتر جلو می‌برد (در خط فرمان).

  • ‎Ctl-G‎

    زنگ. در برخی ترمینال‌های قدیمی تایپ از راه دور، این کاراکتر واقعاً یک زنگ می‌نواخت. در یک xterm ممکن است صدای کوتاهی بدهد.

  • ‎Ctl-H‎

  • پاک کردن (backspace مخرب). اشاره‌گر در حالی که عقب می‌رود کاراکتری را که روی آن قرار می‌گیرد پاک می‌کند.

    #!/bin/bash
    #
    
    a="^H^H"                  #                   
                              #
    echo "abcdef"             #
    echo
    echo -n "abcdef$a "       #
    #‎
    echo
    echo -n "abcdef$a"        #
    #     بدون فاصله انتها  ‎^‎    پسبرد انجام نمی‌شود(چرا؟)‏‎
    #                   ‎
    echo; echo
    #              ‎
    #‎
    #    ‎
    #‎
    # ‎
    
    ########################################
    
    #        ‎
    
    rubout="^H^H^H^H^H"      #  5 بار Ctl-H
    echo -n "12345678"
    sleep 2
    echo -n "$rubout"
    sleep 2

  • ‎Ctl-I‎

    tab افقی.

  • ‎Ctl-J‎

    سطر جدید (تعویض سطر). در یک اسکریپت نیز می‌تواند به صورت نشانه‌گذاری اکتال ‎ '\012'‎ یا هگزادسیمال ‎ '\x0a'‎ بیان گردد.

  • ‎Ctl-K‎

    tab عمودی.

    موقع تایپ نمودن متن در console یا در یک پنجره ‎xterm‎،‏ ‎Ctl-K‎ از کاراکتر زیر اشاره‌گر تا انتهای سطر را پاک می‌کند. در داخل یک اسکریپت، ‎Ctl-K‎ ممکن است به طور متفاوتی رفتار نماید، همچون در مثال ‎Lee Maschmeyer‎ پایین.

  • ‎Ctl-L‎

    Formfeed (پاک کردن صفحه ترمینال). در ترمینال، دارای همان نتیجه فرمان clear است. موقع ارسال به چاپگر، یک ‎Ctl-L‎ باعث پیش رفتن به انتهای صفحه کاغذ می‌گردد.

  • ‎Ctl-M‎

  • برگشت به سر سطر.

    #!/bin/bash
    #‎
    
    read -n 1 -s -p \
    $'Control-M leaves cursor at beginning of this line. Press Enter. \x0d'
               #          
    echo >&2   #          
               #+   
    
    read -n 1 -s -p $'Control-J leaves cursor on next line. \x0a'
               # 
    echo >&2
    
    ###
    
    read -n 1 -s -p $'And Control-K\x0bgoes straight down.'
    echo >&2          #                
    
                      #            
    
    var=$'\x0aThis is the bottom line\x0bThis is the top line\x0a'
    echo "$var"
                      # 
    echo "$var" | col
    # 
    #   
    #+        
    
    #                 
    # 
    #     ‎
    #+    بدون سر سطر رفتن به طور درست پایین برود. این فقط در دستگاههایی‎
    #         
    #    مقصود اصلی از ‎VT‎ ‏(tab عمودی) مستقیم بالا رفتن است نه پایین رفتن.‎
    #         
    #‎
    
    exit 0

  • ‎‎Ctl-N‎‎

    یک سطرِ متن فراخوانی شده از بافر تاریخچه را پاک می‌کند‎[8]‎ (در خط فرمان).

  • ‎Ctl-O‎

    یک سطر جدید بیرون می‌دهد(در خط فرمان).

  • ‎Ctl-P‎

    آخرین فرمان را از بافر تاریخچه فراخوانی می‌کند (در خط فرمان).

  • ‎Ctl-Q‎

    ادامه دادن (‎XON‎).

    در ترمینال این کاراکتر کنترلی stdin را ادامه می‌دهد.

  • ‎Ctl-R‎

    متن را به طرف عقب در بافر تاریخچه جستجو می‌کند (در خط فرمان).

  • ‎Ctl-S‎

    تعلیق ‎(XOFF)‎.

    این مورد در ترمینال stdin را مسدود می‌کند (برای دوباره به دست آوردن ورودی، ‎Ctl-Q‎ را به کار ببرید).

  • ‎Ctl-T‎

    جابجا کردن کاراکتری که اشاره‌گر روی آن است با کاراکتر قبلی (در خط فرمان). مترجم: به طور نمونه اگر هنگام تایپ در خط فرمان برای تعویض دایرکتوری، dc را به جای فرمان cd تایپ نمودید، با استفاده از این کاراکتر کنترل می‌توانید آن را اصلاح کنید.

  • ‎Ctl-U‎

    پاک کردن سطر ورودی از محل اشاره‌گر تا ابتدای سطر. در برخی تنظیمات، ‎Ctl-U‎، صرفنظر از مکان اشاره‌گر تمام سطر ورودی را پاک می‌کند.

  • ‎Ctl-V‎

  • هنگام وارد کردن متن، ‎Ctl-V‎ درج کاراکترهای کنترلی را میسر می‌کند. برای مثال، دو مورد زیر مترادف هستند:

    echo -e '\x0a'
    echo <Ctl-V><Ctl-J>

    ‎Ctl-V‎ بیشتر در داخل یک ویرایشگر متن مفید است.

  • ‎Ctl-W‎

    موقع تایپ متن در console یا در یک پنجره ‎xterm‎، ‏‎Ctl-W‎ از کاراکتر زیر اشاره‌گر به طرف عقب تا اولین نمونه از فضای سفید را پاک می‌کند. در برخی تنظیمات، ‎Ctl-W‎ به طرف عقب تا اولین کاراکتر غیر الفبایی را پاک می‌کند.

  • ‎Ctl-X‎

    در بعضی برنامه‌های واژه‌پرداز، متن انتخاب شده (highlighted) را می‌بُرد و به clipboard کپی می‌کند.

  • ‎Ctl-Y‎

    متن قبلاً پاک شده( با ‎Ctl-U‎ یا ‎Ctl-W‎) را Paste می‌کند.

  • ‎Ctl-Z‎

    یک job پیش‌زمینه رامتوقف می‌سازد.

    در برخی برنامه‌های کاربردی واژه‌پرداز عمل جایگزینی را انجام می‌دهد.

    کاراکتر EOF (انتهای فایل) در سیستم فایل MSDOS.

65. Whitespace

به عنوان یک جداکننده میان فرمانها و/یا متغیرها عمل می‌کند. فضای سفید از فاصله‌ها، tabها، سطرهای خالی، یا هر ترکیبی از آنها، تشکیل می‌شود.‎[9]‎ در بعضی زمینه‌ها، از قبیل تخصیص متغیر، فضای سفید مجاز نیست، و به خطای نحوی (ترکیب دستوری) منجر می‌گردد.

سطرهای خالی تاثیری در عملکرد اسکریپت ندارند، و بنابراین برای جداسازی بصری قسمت‌های کارکردی مناسب هستند.

متغیر ویژه ‎$IFS‎، جداکننده فیلدهای ورودی برخی فرمان‌ها است. پیش‌فرض این متغیر فضای سفید است.

برای محافظت از فضای سفید درون یک رشته یا یک متغیر، از نقل‌قول کردن استفاده نمایید.

فیلترهای یونیکس می‌توانند با استفاده از کلاس کاراکتر ‎[:space:]‎ استاندارد POSIX فضای سفید را هدف‌گیری و روی آن عمل کنند.

یادداشت‌ها

[1]

یک عملگر عاملی است که یک عمل را انجام می‌دهد. چند مثال عبارتند از عملگرهای حسابی معمولی، ‎+ - * /‎. در Bash، مقداری همپوشانی میان مفاهیم عملگر و کلید واژه وجود دارد.

[2]

این معمولاً بیشتر به عنوان عملگر ternary (سه‌تایی) شناخته می‌شود. متاسفانه، سه‌تایی یک کلمه ناخوش‌آیند است. به زبان آوردن آن آسان نبوده، و شفاف نیست. گیج‌کننده است. کاربرد Trinary (سه‌گانه) به مراتب برازنده‌تر است. (مترجم: نویسنده محترم از طریق بازی با کلمات مزاح می‌فرمایند.)

[3]

American Standard Code for Information Interchange (کد استاندارد امریکایی برای مبادله اطلاعات). سیستمی برای کد کردن کاراکترهای متن(الفبایی، عددی، و مجموعه محدودی از علامت‌ها) به صورت اعداد ۷بیتی است که می‌تواند به وسیله کامپیوترها ذخیره و دستکاری بشود. بسیاری از کاراکترهای ASCII در یک صفحه‌کلید استاندارد نمایندگی می‌شوند.

[4]

PID، یا ID پردازش، یک عدد اختصاص یافته به یک پردازش در حال اجرا است. می‌توان PID پردازش‌های در حال اجرا را به وسیله یک فرمان ps مشاهده نمود.

تعریف: پردازش، یک فرمان (یا برنامه) به طور جاری درحال اجرا است، گاهی اوقات به عنوان یک job به آن اشاره می‌شود.

[5]

پوسته بسط ابرو را انجام می‌دهد. خود فرمان بر روی نتیجه بسط عمل می‌کند.

[6]

استثنا: یک قطعه کدِ داخل ابروها به عنوان قسمتی از یک لوله ممکن است به صورت یک پوسته فرعی اجرا گردد.

ls | { read firstline; read secondline; }
#
#+‎
echo "First line is $firstline; second line is $secondline"  #
#

[7]

حتی همچنانکه در زمانهای کهن philtre بیانگر یک داروی منتسب به داشتن قدرتهای جادویی دگرگونی بود، همینطور فیلتر UNIX به سبک (تقریباً) قابل قیاسی هدفش را دگرگون می‌کند. (برنامه‌نویسی که با یک "love philtre" (شربت سحرآمیز) که بر روی ماشین لینوکس اجرا می‌گردد پیش بیاید، به طور محتمل تحسین‌ها و افتخارات را به دست خواهد آورد.)مترجم: در اینجا نویسنده به یک بازی کلمات بین philtre به معنی طلسم عشق و filter به عنوان ابزار سودمند یونیکس پرداخته تا اهمیت این ابزارهای قدرتمند را با تشبیه به نیرویی مافوق طبیعی به خواننده یادآوری نماید.

[8]

Bash فهرستی از فرمانهایی را که قبلاً در خط فرمان صادر شده‌اند در یک بافر، یا فضای حافظه، برای فراخوانی به وسیله فرمانهای داخلی history نگهداری می‌کند.

[9]

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