چه چیزی یک کاراکتر را خاص میکند؟ در صورتیکه کاراکتری فراتر از مصداق لفظیاش، دارای یک مفهوم فوقانی باشد، آنوقت ما به عنوان یک کاراکتر خاص به آن اشاره میکنیم. کاراکترهای خاص همراه با فرمانها و کلیدواژهها، قطعات اسکریپتهای Bash را میسازند.
کاراکترهای ویژه به کار رفته در اسکریپتها و جاهای دیگر
Comments. سطرهایی که با یک کاراکتر # شروع میشوند (به استثنای #!) توضیح هستند و در نظر گرفته نخواهند شد.
#
همچنین ممکن است توضیحات متعاقب انتهای یک فرمان قرار بگیرند.
echo "A comment will follow." # #
توضیحات همچنین ممکن است بعد از فضای سفید ابتدای یک سطر قرار گیرند.
توضیحات حتی ممکن است در داخل یک لوله جاسازی بشوند.
initial=( `cat "$startfile" | sed -e '/#/d' | tr -d '\n' |\ # sed -e 's/\./\. /g' -e 's/_/_ /g'` ) #
بعد از توضیح، قرار گرفتن یک فرمان در همان سطر میسر نیست. هیچ شیوه صحیح برای خاتمه دادن توضیح به منظور شروع «کد مؤثر» در همان سطر، وجود ندارد. برای فرمان بعدی از یک سطر جدید استفاده کنید. |
البته، یک # نقلقولشده یا معاف شده در یک دستور 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 )) # # |
برخی عملیات انطباق الگو نیز # را به کار میبرند.
جداکننده فرمان [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) بشود.
خاتمهدهنده در یک گزینه
case "$variable" in abc) echo "\$variable = abc" ;; xyz) echo "\$variable = xyz" ;; esac
خاتمهدهنده در یک گزینه
فرمان «dot» [نقطه]. معادل با source ( مثال 15-22 را ببینید). این یک builtin پوسته bash است.
«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.
کاراکتر انطباق «dot». موقع انطباق کاراکترها، به عنوان بخشی از یک عبارت منظم، یک «نقطه» با یک کاراکتر منفرد منطبق میگردد.
نقلقول نیمه کامل [نقلقول دوگانه]. "STRING" اکثر کاراکترهای خاص در داخل STRING را معاف (از تفسیر) میکند. فصل 5 را ببینید.
نقلقول کامل [نقلقول منفرد]. 'STRING' تمام کاراکترهای خاص درون STRING را معاف میکند. این یک شکل قویتر از نقلقول "STRING" است. فصل 5 را ببینید.
عملگر کاما. عملگر کاما[1] یک گروه از عملیات محاسباتی را به یکدیگرمتصل میکند. تمام عملکردها ارزیابی میشوند اما فقط آخرین عمل برگشت داده میشود.
let "t2 = ((a = 9, 15 / 3))" #
عملگر comma همچنین میتواند رشتهها را بهم پیوست نماید.
for file in /{,usr/}bin/*calc # #+ do if [ -x "$file" ] then echo $file fi done # # # # #
تبدیل به حرف کوچک در جایگزینی پارامتر (اضافه شده در نگارش 4 از Bash).
گریز [backslash]. یک ساز و کار نقلقول برای یک کاراکتر منفرد.
\X کاراکتر X رامعاف میکند. این مورد دارای همان تاثیر «نقلقول» X است، و معادل 'X' میباشد. کاراکتر \ میتواند جهت نقلقول " و ' برای اینکه آنها به طور لفظی بیان گردند، به کار برود.
برای یک توضیح دقیق و عمیقِ کاراکترهای معاف شده، فصل 5 را ملاحظه نمایید.
جداکننده مسیر نام فایل [forward slash]. اجزا تشکیلدهنده نام فایل (همچون در /home/bozo/projects/Makefile) را تفکیک میکند.
این کاراکتر همچنین عملگر تقسیم حسابی است.
جایگزینی فرمان. ساختار `command` تخصیص خروجی command به یک متغیر را مقدور میسازد. این کاراکتر نقلقول برعکس یا backtick نیز نامیده میشود.
فرمان پوچ [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 # # #
در ترکیب با عملگر تغییرمسیر >> ، تاثیری در فایل مقصد از قبل موجود ندارد (: >> 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 () { : } #
[bang] مفهوم یک آزمون یا وضعیت خروج را برعکس (یا منفی) میکند. عملگر ! وضعیت خروج فرمانی را که بر آن اِعمال میگردد وارونه میسازد (مثال 6-2 را ببینید). همچنین، معنی عملگر تست را برعکس میکند. برای مثال، این عملگر میتواند مفهوم مساوی ( = ) را به نامساوی ( != )تغییر بدهد. عملگر ! یک کلمهکلیدی Bash است.
در یک مضمون متفاوت، ! در ارجاعهای متغیر غیر مستقیم نیز ظاهر میشود.
باز هم در یک مضمون دیگر، عملگر ! از خط فرمان، ساز و کار تاریخچه Bash را احضار میکند( پیوست L را ببینید). توجه نمایید که در داخل اسکریپت، ساز و کار تاریخچه غیر فعال است.
کاراکتر عام [ستاره]. کاراکتر * به عنوان یک «کاراکتر عام» برای بسط نامفایل در globbing به کار میرود. خودش به تنهایی با هر نام فایل در دایرکتوری جاری منطبق میگردد.
bash$ echo * abs-book.sgml add-drive.sh agram.sh alias.sh
همچنین در یک عبارت منظم کاراکتر * هر تعداد (یا صفر) کاراکتر را نمایندگی میکند.
عملگر حسابی. در متن عملیات حسابی، کاراکتر * علامت ضرب است.
** یک زوج ستاره میتواند نماینده عملگر به توان رساندن یا globbing انطباق فایل توسعه یافته باشد.
عملگر test. داخل برخی عبارتها، کاراکتر ? نشان دهنده یک بررسی برای یک شرط است.
در یک ساختار پرانتز دوتایی، کاراکتر ? میتواند به عنوان یک عضو عملگر trinary (سهگانه) سبکِ-C به کار برود.[2]
condition?result-if-true:result-if-false
(( var0 = var1<98?9:21 )) # # # # # # #
در یک عبارت جایگزینی پارامتر، کاراکتر ?بررسی میکند که آیا یک متغیر تنظیم شده است.
کاراکتر عام. کاراکتر ? به عنوان یک کاراکتر منفرد «کاراکتر عام» در globbing، و همچنین نمایندگی یک کاراکتر در یک عبارت منظم توسعهیافته به کار میرود.
جایگزینی متغیر (محتویات یک متغیر).
var1=5 var2=23skidoo echo $var1 # echo $var2 #
یک $ پیشوند شده به نام یک متغیر بیانگر مقداری است که متغیر نگهداری میکند.
انتهای سطر. در یک عبارت منظم، یک $ انتهای سطر در متن را آدرسدهی میکند.
بسط رشته نقلقولی. این ساختار مقادیر هگزا یا اکتال منفرد یا چندگانه escap شده را به ASCII [3] یا کاراکترهای Unicode بسط میدهد.
متغیر وضعیت خروج. متغیر $? نگهدارنده وضعیت خروجِ یک فرمان، یک تابع، یا وضعیت خروج خود اسکریپت میباشد.
گروه فرمان.
(a=hello; echo $a)
لیستی از فرمانها در درون پرانتزها، یک پوسته فرعی را شروع میکند. متغیرهای داخل پرانتزها، داخل پوسته فرعی، در بقیه اسکریپت قابل مشاهده نیستند. پردازش والد یعنی اسکریپت، نمیتواند متغیرهای تولید شده در پردازش فرزند، یعنی پوسته فرعی، را بخواند. a=123 ( a=321; ) echo "a = $a" # # |
echo \"{These,words,are,quoted}\" # # cat {file1,file2,file3} > combined_file # cp file22.{txt,backup} #
یک فرمان میتواند روی لیستی از مشخصههای فایل در درون ابروها که با کاما از یکدیگر جدا شدهاند، عمل نماید. [5] بسط نام فایل (globbing) بر مشخصههای فایل میان ابروها اعمال میگردد.
در داخل ابروها هیچ فاصلهای مجاز نیست، مگراینکه فاصلهها نقلقول شده یا معاف شده(escaped) باشند. echo {file1,file2}\ :{\ A," B",' C'} file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C |
بسط ابروی توسعهیافته.
echo {a..z} # # echo {0..3} # # base64_charset=( {A..Z} {a..z} {0..9} + / = ) # #
ساختار {a..z} بسط ابروی توسعهیافته، یک ویژگی معرفی شده در نگارش 3 پوسته Bash است.
قطعه کد [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 غیر استاندارد امکانپذیر است. |
placeholder برای متن. استفاده شده بعد از xargs -i (تعویض رشتهها). ابروهای دوتایی {} یک جاینگهدار برای متن خروجی هستند.
ls . | xargs -i -t cp ./{} $1 # #
نام مسیر. بیشتر در ساختارهای find به کار رفته است. این یک دستور داخلی پوسته نیست.
تعریف: نام مسیر، یک نام فایل است که در بر دارنده مسیر کامل فایل است. به عنوان مثال، /home/bozo/Notes/Thursday/schedule.txt یک نام مسیر است. نام مسیر گاهی اوقات به عنوان مسیر مطلق مورد اشاره قرار میگیرد. |
کاراکتر ; گزینه -exec رشته فرمان find را خاتمه میدهد. به منظور محافظت آن از تفسیر شدن توسط شل، لازم است escaped(معاف از تفسیر) بشود. |
بررسی عبارت درون [ ]. توجه نمایید که [ جزء مساوی با فرمان داخلی test پوسته است (و یک مترادف برای آن است)، نه یک پیوند به فرمان خارجی /usr/bin/test
test.
بررسی عبارت میان
گفتگو در مورد ساختار
عضو آرایه.
در مضمون یک آرایه، bracketها شماره هر یک از عناصر آن آرایه را احاطه میکنند.
Array[1]=slot_1 echo ${Array[1]}
حدود کاراکترها.
به عنوان قسمتی از یک عبارت منظم، bracketها محدوده کاراکترها جهت مطابقت دادن را مشخص میکنند.
بسط عدد صحیح.
ارزیابی عبارت صحیح میانِ $[ ].
a=3 b=7 echo $[$a+$b] echo $[$a*$b]
توجه داشته باشید که این کاربرد نکوهش گردیده است، و با ساختار (( ... )) جایگزین شده است.
بسط عدد صحیح.
بسط و ارزیابی عبارت صحیح میان (( )).
بحث در باره ساختار (( ... )) را ببینید.
scriptname >filename خروجیscriptname را به فایل filename تغییر مسیر میدهد. اگر filename از قبل موجود باشد آن را رونویسی میکند.
command &>filename هر دو مورد stdout و stderr مربوط به command را به filename تغییر مسیر میدهد.
command >&2 خروجی استاندارد command را به stderr تغییر مسیر میدهد.
scriptname >>filename خروجی استاندارد scriptname را به فایلِ filename پیوست مینماید. در صورتیکه filename از قبل موجود نباشد، ایجاد میگردد.
[i]<>filename فایل filename را برای خواندن و نوشتن باز میکند، و توصیفگر فایل i را به آن تخصیص میدهد. اگر filename موجود نباشد، ایجاد میگردد.
(command)>
<(command)
در یک مضمون متفاوت، کاراکترهای < و > به عنوان عملگرهای مقایسه رشته عمل میکنند.
در یک زمینه دیگر، کاراکترهای < و > به عنوان عملگرهای مقایسه عدد صحیح رفتار مینمایند. همچنین مثال 16-9 را ملاحظه کنید.
تغییر مسیر مورد استفاده در یک here document.
تغییر مسیر به کار رفته در یک here string.
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
مرز کلمه در یک عبارت منظم.
bash$ grep '\<the\>' textfile
pipe. خروجی استاندارد(stdout) فرمان قبل را به ورودی استاندارد (stdin) فرمان بعد، یا به پوسته عبور میدهد. این روشی برای زنجیر کردن فرمانها با یکدیگر است.
echo ls -l | sh # #+ cat *.lst | sort | uniq #
یک pipe(لوله)، به عنوان روش کلاسیک ارتباط درونپردازشی، stdout یک پردازش را به stdin یک پردازش دیگر ارسال میکند. در یک مورد نمادین، فرمانی از قبیل cat یا echo، جریانی از داده را به یک فیلتر، یعنی فرمانی که ورودیاش را به جای پردازش تغییرشکل میدهد، لولهکشی مینماید. [7] cat $filename1 $filename2 | grep $search_word برای یک توضیح جالب توجه در مورد پیچیدگی کاربرد لولههای UNIX، پرسش و پاسخهای UNIX، بخش 3 را ببینید. |
خروجی یک یا چند فرمان میتواند به یک اسکریپت لولهکشی بشود.
#!/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 ارسال میکند. |
اجبار به تغییر مسیر (حتی اگر گزینه noclobber تنظیم شده باشد). این عملگر باعث رونویسی اجباری فایل میگردد.
عملگر منطقی or. در یک ساختار test، عملگر || در صورتیکه که هریک از شرطهای بررسی متصل شده با این عملگر صحیح باشد، موجب برگشت دادن یک صفر (موفقیت) خواهد شد.
اجرای 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 # #+
در داخل یک اسکریپت، فرمان اجرا شده در پسزمینه ممکن است در انتظار یک ضربه کلید متوقف بشود. خوشبختانه، یک راه گریز برای این مورد موجود است. |
عملگر منطقی and. در یک ساختار test ، عملگر && فقط اگر هر دو شرط بررسی متصلشده توسط این عملگر صحیح باشند، باعث برگشت دادن یک 0 (موفقیت) میگردد.
گزینه، پیشوند. نشانه گزینه برای فرمان یا فیلتر. پیشوند برای یک عملگر. پیشوند برای یک پارامتر قراردادی در جایگزینی پارامتر.
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، به معنی انتهای گزینهها برای آن فرمانِ بخصوص است.
این مورد، وسیله سودمندی برای حذف فایلهایی که نام آنها با یک خطتیره شروع میگردد فراهم مینماید. 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)
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
نام فایلهایی که با - شروع میشوند وقتی با عملگر تغییر مسیر - جفت شوند، ممکن است باعث مشکلاتی بشوند. یک اسکریپت باید این مورد را بررسی نموده و یک پیشوند متناسب به این قبیل نام فایلها اضافه کند، به عنوان مثال ./-FILENAME، $PWD/-FILENAME، یا $PATHNAME/-FILENAME. اگر مقدار یک متغیر با یک - شروع گردد، این نیز میتواند مشکلاتی ایجاد کند. var="-n" echo $var # |
دایرکتوری کاری پیشین. یک فرمان cd - دایرکتوری را به دایرکتوری کاری قبلی تعویض میکند. در این حالت از متغیر محیطی $OLDPWD استفاده میشود.
- استفاده شده در این حالت را با عملگر تغییر مسیر - که اندکی قبل بحث شد، اشتباه نکنید. تفسیر کردن - به مضمونی که در آن ظاهر میشود بستگی دارد. |
منها. علامت منها در یک عملیات حسابی.
تساوی. عملگر تخصیص
a=28 echo $a #
در یک مضمون متفاوت، = یک عملگر مقایسه رشته است.
بعلاوه. عملگر حسابی جمع.
در یک زمینه متفاوت، + یک عملگر عبارت منظم است.
گزینه. نشانه گزینه برای یک فرمان یا فیلتر.
برخی فرمانها و builtinها از + برای فعال نمودن برخی گزینهها و از - برای غیرفعال نمودن آنها استفاده میکنند. در جایگزینی پارامتر، + به یک مقدار علیالبدل که متغیر به آن بسط مییابد پیشوند میگردد.
modulo. عملگر حسابی پیمانهای(باقیمانده تقسیم).
let "z = 5 % 3" echo $z #
در یک مضمون دیگر، % یک عملگر انطباق الگو است.
دایرکتوری خانه [مَد]. این متناظر است با متغیر داخلی $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
دایرکتوری کاری جاری. این متناظر با متغیر داخلی $PWD است.
دایرکتوری کاری قبلی. این مورد متناظر با متغیر داخلی $OLDPWD است.
انطباق عبارت منظم. این عملگر با نگارش 3 پوسته Bash معرفی گردید.
ابتدای سطر. در یک عبارت منظم، یک ^ به ابتدای سطر متن آدرسدهی میکند.
تبدیل به حروف بزرگ در جایگزینی پارامتر (اضافه شده در نگارش 4 از Bash).
تغییر رفتار ترمینال یا نمایش متن. یک کاراکتر کنترل عبارت است از ترکیب 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
جابجا کردن کاراکتری که اشارهگر روی آن است با کاراکتر قبلی (در خط فرمان).
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.
به عنوان یک جداکننده میان فرمانها و/یا متغیرها عمل میکند. فضای سفید از فاصلهها، 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" (شربت سحرآمیز) که بر روی ماشین لینوکس اجرا میگردد پیش بیاید، به طور محتمل تحسینها و افتخارات را به دست خواهد آورد.) |
[8] |
Bash فهرستی از فرمانهایی را که قبلاً در خط فرمان صادر شدهاند در یک بافر، یا فضای حافظه، برای فراخوانی به وسیله فرمانهای داخلی history نگهداری میکند. |
[9] |
یک linefeed (سطر جدید) نیز یک کاراکتر فضای سفید است. این مطلب روشن میکند که چرا یک سطر خالی، تشکیل شده از فقط یک linefeed، به عنوان فضای سفید در نظر گرفته میشود. |