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

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

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

1. #

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

# .این سطر یک توضیح است

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

echo "A comment will follow." #                  .توضیح در اینجا‎
#                            ^ به فضای سفید قبل از # توجه نمایید

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

     # .مقدم بر این سطر است tab یک کاراکتر

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

initial=( `cat "$startfile" | sed -e '/#/d' | tr -d '\n' |\
#  .'#' حذف سطرهای شامل کاراکتر توضیح‎
           sed -e 's/\./\. /g' -e 's/_/_ /g'` )
#  life.sh بریده شده از اسکریپت‎

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))"
# را تنظیم می‌کند ‎"t2 = 15 / 3"‎ و ‎"a = 9"‎ 

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

for file in /{,usr/}bin/*calc
#             ^    ختم می‌گردند "calc" پیدا کردن تمام فایل‌های اجرایی که به ‎
#+                  ‎/bin‎ و ‎/usr/bin‎ در دایرکتوری‌های‎
do
        if [ -x "$file" ]
        then
          echo $file
        fi
done

# /bin/ipcalc
# /usr/bin/kcalc
# /usr/bin/oidcalc
# /usr/bin/oocalc


# به خاطر اشاره کردن به این مورد Rory Winston با تشکر از

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 $?   # 0

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

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

# :معادل است با‎
#    while true
#    do
#      ...
#    done

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

if condition
then :   # هیچ کاری نکن و به پیش برو‎
else     #                 ...وگرنه ‎
   take-some-action
fi

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

: ${username=`whoami`}
  #         ‎${username=`whoami`}‎ بدون : مقدم، یک خطا نمایش می‌دهد‎
  #           یک فرمان یا دستور داخلی باشد "username" مگر اینکه‎

: ${1?"Usage: $0 ARGUMENT"}  # usage-message.sh از اسکریپت مثال

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

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

: ${HOSTNAME?} ${USER?} ${MAIL?}
# .اگر یک یا چندتا از متغیرهای محیطی ضروری برقرار نباشند پیغام خطا چاپ می‌کند‎

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

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

: > data.xxx     #            اکنون تهی است ‎"data.xxx"‎ فایل ‎

# است، اما این فرمان ‎cat /dev/null >data.xxx‎ دارای همان اثر‎
#       .است builtin یک ‎":"‎ یک پردازش جدید منشعب نمی‌کند چون

همچنین مثال ‎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"
 #    به عنوان نام یک تابع استفاده کنیم؟ colon چرا از یک ‎
 #                   .این روشی برای مبهم کردن کد شما است‎
}

:

 #                             .این تابع دارای نام : است

این یک رفتار قابل حمل نیست، و بنابراین یک رویه توصیه شده نیست. در حقیقت، نگارش‌های جدیدتر 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 ))
#                ^ ^

# if [ "$var1" -lt 98 ]
# then
#   var0=9
# else
#   var0=21
# fi

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

20. ?

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

21. $

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

var1=5
var2=23skidoo

echo $var1     # 5
echo $var2     # 23skidoo

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

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"   # a = 123
# .در درون پرانتزها مانند یک متغیر محلی عمل می‌کند ‎"a"‎ 

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

Array=(element1 element2 element3)

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

بسط ابرو.

echo \"{These,words,are,quoted}\"    #     پیشوند و پسوند می‌شود‎ " کاراکتر
 #                                         "These" "words" "are" "quoted"


cat {file1,file2,file3} > combined_file
 #با هم ادغام می‌کند‎ combined_file را در فایل file3 و file2 ،file1 فایلهای

cp file22.{txt,backup}   #   کپی می‌کند "file22.backup"‎ را به ‎"file22.txt"‎ 

یک فرمان می‌تواند روی لیستی از مشخصه‌های فایل در درون ابروها که با کاما از یکدیگر جدا شده‌اند، عمل نماید. ‎[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} #    a b c d e f g h i j k l m n o p q r s t u v w x y z
            #                       .می‌کند echo را z تا a کاراکترهای‎

echo {0..3} #                     0 1 2 3
            #                     .می‌نماید echo را ‎3‎ تا ‎0‎ کاراکترهای ‎


base64_charset=( {A..Z} {a..z} {0..9} + / = )
            # .مقداردهی یک آرایه، با استفاده از بسط ابروی توسعه‌یافته‎
            #               ‎"base64.sh"‎ با نام vladz از اسکریپت مثال

ساختار ‎{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"   # a = 321   (مقدار داخل قطعه کد)

# Thanks, S.C.

ممکن است به قطعه کد محصور شده در ابروها یا از آن، تغییر مسیر 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

# حال، شما چگونه فیلدهای جداگانه هر سطر را تجزیه می‌کنید؟‎
#                   . . . را به کار ببرید یا awk ‎:‎ اشاره ‎
# .را پیشنهاد می‌کند Bash پوسته set استفاده از فرمان داخلی Hans-Joerg Diers‎

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

#!/bin/bash
# rpm-check.sh

# را جهت توصیف، لیست آن و اینکه آیا rpm یک فایل‎
#+          .می‌تواند نصب بشود، پرس و جو می‌نماید‎
#            .خروجی را در یک فایل ذخیره می‌نماید‎
# 
# .این اسکریپت کاربرد یک قطعه کد را نمایش می‌دهد‎

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  #          .می‌تواند نصب بشود rpm تحقیق آن که آیا فایل‎
  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"

                    #  .را ببینید rpm در مورد man برای توضیح گزینه‌ها صفحه‎

exit 0

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

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

32. ‎{}‎

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

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

# ‎ex42.sh (copydir.sh)‎ از مثال‎

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]   # 10
echo $[$a*$b]   # 21

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

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 $?   # 0


cmd=bogus_command            # فرمان نامشروع‎
command_test $cmd; echo $?   # 1

‎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
#  را به شل ارسال می‌کند ‎"echo ls -l"‎ خروجی‎
#+  .ساده است ‎"ls -l"‎ دارای همان نتیجه‌ی یک‎


cat *.lst | sort | uniq
# .را با هم ادغام و مرتب کرده، سپس سطرهای تکراری را حذف می‌کند ‎".lst"‎ تمام فایلهای

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

#!/bin/bash
# uppercase.sh : ورودی را به حروف بزرگ تبدیل می‌کند‎

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
# .ناپدید می‌شود ‎"cat file1 file2"‎ خروجی

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

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

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

46. ‎>|‎

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

47. ||

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

48. ‎&‎

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

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

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

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

#!/bin/bash
# background-loop.sh

for i in 1 2 3 4 5 6 7 8 9 10              #   حلقه اول‎
do
  echo -n "$i "
done &   #              .این حلقه در پس‌زمینه اجرا می‌شود‎
         # .گاهی اوقات بعد از حلقه دوم اجرا خواهد گردید‎

echo     #  .گاهی اوقات نمایش داده نخواهد شد ‎'echo'‎ این‎

for i in 11 12 13 14 15 16 17 18 19 20     #   حلقه دوم‎
do
  echo -n "$i "
done  

echo     #  .گاهی اوقات نمایش داده نخواهد شد ‎'echo'‎ این‎

#======================================================

#                         :خروجی مورد انتظار از اسکریپت‎
# 1 2 3 4 5 6 7 8 9 10 
# 11 12 13 14 15 16 17 18 19 20 

#       :با وجود این گاهی اوقات این مورد را خواهید داشت‎
# 11 12 13 14 15 16 17 18 19 20 
# 1 2 3 4 5 6 7 8 9 10 bozo $
#                     دوم اجرا نگردیده است. چرا؟ ‎'echo'‎ ‎

#                                        :همچنین گهگاهی‎
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#                     اول اجرا نگردیده است. چرا؟ ‎'echo'‎ ‎

#                              :خیلی به ندرت چیزی مانند‎
# 11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20 
#          .حلقه پیش‌زمینه به حلقه پس‌زمینه پیشدستی می‌کند‎

exit 0

#‎ sleep 1‎ نسیم‌الدین انصاری برای قدری تفریح واقعی‌ افزودن‎
#+پیشنهاد می‌کند ‎echo -n "$i"‎ بعد از ‎14‎ و ‎6 را در سطرهای

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>, همراه یک تغییر جزیی‎]

# 1) cd /source/directory
#  .دایرکتوری مبدا، جایی که فایلهای مورد نظر برای انتقال قرار دارند‎
# 2) &&
#                          موفق باشد cd برای اینکه اگر عمل And لیست ‎
#                                        .آنوقت فرمان بعد اجرا بشود‎
# 3) tar cf - .
# یک بایگانی جدید ایجاد می‌کند ‎'tar'‎ با فرمان بایگانی کردن ‎'c'‎ گزینه‎
#     فایل مبدا را به عنوان خروجی ‎'-'‎ دنبال شده با ‎'f' (file)‎ گزینه ‎
# قرار می‌دهد ‎('.')‎ استاندارد تخصیص داده و آن را درخت دایرکتوری جاری‎
# 4) |
#                                                   ... لوله‌کشی به‎
# 5) ( ... )
#                                                    یک پوسته فرعی‎
# 6) cd /dest/directory
#                                          .رفتن به دایرکتوری مقصد‎
# 7) &&
#   مانند فوق And لیست‎
# 8) tar xpvf -
#           و ‎('p')‎ و حفظ مالکیت و مجوزهای فایل ‎('x')‎ استخراج فایل‎
#           به خروجی استاندارد و خواندن ‎('v')‎ و ارسال پیغام تفصیلی ‎
#                 ‎('-'‎ دنبال شده با 'f')‎ داده‌ها از ورودی استاندارد‎
#
#    .گزینه هستند ‎'p', 'v', 'f'‎ یک فرمان است و  ‎'x'‎ توجه نمایید که‎
#
#                                                             !واه‎



#                                     :بیشتر برازنده، اما معادل با‎
#   cd source/directory
#   tar cf - . | (cd ../dest/directory; tar xpvf -)

#                                  :همچنین دارا بودن همان نتیجه با ‎
# cp -a /source/directory/* /dest/directory
#     :یا‎
# cp -a /source/directory/* /source/directory/.[^.]* /dest/directory
#                 ‎/source/directory‎ در صورت داشتن فایلهای پنهان در‎

bunzip2 -c linux-2.6.16.tar.bz2 | tar xvf -
#  --‎tar‎ استخراج فایل--         | --‎"tar"‎ سپس تحویل آن به برنامه--
#   نباشد لازم است این ‎"bunzip2"‎ دارای وصله کار کردن با ‎"tar"‎ اگر‎
# +   .مورد با استفاده از یک لوله در دو مرحله جدا ازهم انجام شود‎
#       .کرنل است ‎"bzipped"‎ هدف تمرین از بایگانی خارج نمودن منبع ‎

توجه نمایید که در این مضمون کاراکتر - خودش یک عملگر 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

#   تهیه پشتیبان از تمام فایلهای دایرکتوری جاری که ظرف ۲۴ ساعت گذشته‎‎
#+ (شده ‎gzip‎ فایل بایگانی و) ‎"tarball"‎  تغییر داده شده‌اند در یک فایل ‎

BACKUPFILE=backup-$(date +%m-%d-%Y)
#                 جاسازی تاریخ در نام فایل پشتیبان‎‎
#          برای این ایده ‎Joshua Tschida‎ با تشکر از‎
archive=${1:-$BACKUPFILE}
#  اگر نام فایل پشتیبان در خط فرمان تعیین نشده باشد‎‎
#+ خواهد بود backup-MM-DD-YYYY.tar.gz‎ به طور پیش‌فرض ‎

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

#                Stephane Chazelas
#   اشاره می‌کند  در صورتیکه فایلهای بسیار زیادی‎‎
#+ ‎وجود داشته باشد یا هر یک از نام فایلها دارای‎
#+ باشد کد فوق ناموفق خواهد شد blank کاراکترهای‎‎

#           :او جایگزین‌های زیر را پیشنهاد می‌کند‎
#‎ -------------------------------------------------------------------‎
#‎   find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar"‎
#                ‎"find"‎ با استفاده از نگارش گنو‎


#‎   find . -mtime -1 -type f -exec tar rvf "$archive.tar" '{}' \;‎
#      قابل حمل به سایر سیستم‌های مبتنی بر یونیکس، اما بسیار کندتر‎
#‎ -------------------------------------------------------------------‎


exit 0

Caution

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

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

var="-n"
echo $var		
# است و چیزی بیرون نمی‌دهد ‎"echo -n"‎ دارای اثر‎

52. -

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

Caution

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

53. -

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

54. =

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

a=28
echo $a   # 28

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

55. +

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

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

56. +

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

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

57. %

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

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

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

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
    # .در یک رشته ‎Ctl-H‎ جاسازی‎
    
    a="^H^H"                  #                    ‎backspaces -- Ctl-H‎ دو تا
                              # ‎ctl-H‎ و ‎ctl-V‎ تایپ کنید ‎vi/vim‎ با استفاده از
    echo "abcdef"             # abcdef
    echo
    echo -n "abcdef$a "       # abcd f
    # فاصله در انتها ‎^‎              ‎^‎      دو بار پسبرد‎
    echo
    echo -n "abcdef$a"        # abcdef
    #     بدون فاصله انتها  ‎^‎    پسبرد انجام نمی‌شود(چرا؟)‏‎
    #                    .نتایج ممکن است به کلی آنطور که انتظار می‌رود نباشند‎
    echo; echo
    #               ‎:آزمودن این موارد را پیشنهاد می‌کند Constantin Hagemeier‎ ‎
    #‎ a=$'\010\010'‎
    #    ‎ a=$'\b\b'‎
    #‎ a=$'\x08\x08'‎
    # ‎ .اما، این نیز نتایج را تغییر نمی‌دهد‎
    
    ########################################
    
    #         .حالا این مورد را امتحان کنید‎
    
    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
    # برای این مثال ‎Lee Maschmeyer‎ با تشکر از‎
    
    read -n 1 -s -p \
    $'Control-M leaves cursor at beginning of this line. Press Enter. \x0d'
               #           است ‎Control-M‎ معادل هگزادسیمال ‎'0d'‎ البته ‎
    echo >&2   #           نمایش هر چیز تایپ شده را خاموش می‌کند ‎'-s'‎ ‎
               #+   .بنابراین به طور صریح به سطر جدید رفتن لازم می‌شود
    
    read -n 1 -s -p $'Control-J leaves cursor on next line. \x0a'
               # است ‎Control-J‎ معادل هگز کاراکتر کنترل تعویض سطر ‎'0a'‎‎
    echo >&2
    
    ###
    
    read -n 1 -s -p $'And Control-K\x0bgoes straight down.'
    echo >&2          #                   عمودی است ‎tab‎ یک Control-K‎
    
                      #             :عمودی tab یک مثال بهتر از تاثیر‎
    
    var=$'\x0aThis is the bottom line\x0bThis is the top line\x0a'
    echo "$var"
                      # :این به همان طریق مثال فوق کار می‌کند. اگر چه‎
    echo "$var" | col
    #   .این موجب آن می‌شود که قسمت سمت راست سطر بالاتر از سمت چپ باشد‎
    #     این مورد همچنین روشن می‌کند که چرا ما برای پرهیز از یک صفحه‎
    #+         .شروع و تمام کردیم (line feed) آشفته، با یک تعویض سطر‎
    
    #                 :شرح می‌دهد ‎Lee Maschmeyer‎ به طوریکه‎
    #  -----------------------------------------------------------------
    #    این کاراکتر باعث می‌شود چاپ مطلب  ‎. . .‎ عمودی ‎tab‎  در اولین مثال ‎
    #+    بدون سر سطر رفتن به طور درست پایین برود. این فقط در دستگاههایی‎
    #         .لینوکس که نمی‌توانند عقب‌گرد کنند، صحیح است console از قبیل
    #    مقصود اصلی از ‎VT‎ ‏(tab عمودی) مستقیم بالا رفتن است نه پایین رفتن.‎
    #           .این می‌تواند برای چاپ بالانویس‌ها روی یک چاپگر به کار برود‎
    #.استفاده بشود ‎VT‎ می‌تواند برای شبیه‌سازی رفتار صحیح ‎col‎ برنامه سودمند‎
    
    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; }
#     قطعه کد در ابروها به عنوان یک پوسته فرعی اجرا می‌گردد، بنابراین  ‎.‎خطا‎
#+                 نمی‌تواند به متغیرهای داخل قطعه عبور داده شود ‎"ls"‎ خروجی‎
echo "First line is $firstline; second line is $secondline"  # .کار نمی‌کند
# Thanks, S.C.

[7]

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

[8]

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

[9]

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