ایستگاه های کاری آنلاین OnWorks Linux و Windows

لوگو

میزبانی آنلاین رایگان برای ایستگاه های کاری

<قبلی | فهرست | بعدی>

دستورات گروهی و پوسته های فرعی

بر هم زدن اجازه می دهد تا دستورات با هم گروه بندی شوند. این را می توان به یکی از دو روش انجام داد. یا با یک دستور گروه یا با یک زیر پوسته. در اینجا نمونه هایی از نحو هر کدام آورده شده است:

دستور گروه:

{ فرمان 1; فرمان2; [فرمان 3; ...]}

زیر پوسته:

(فرمان 1؛ فرمان 2؛ [فرمان 3؛...])

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

بنابراین دستورات گروهی و پوسته های فرعی برای چه کاری مناسب هستند؟ در حالی که آنها یک تفاوت مهم دارند (که در یک لحظه به آن خواهیم رسید)، هر دو برای مدیریت تغییر مسیر استفاده می شوند. بیایید یک بخش اسکریپت را در نظر بگیریم که تغییر مسیرها را روی چندین دستور انجام می دهد:



ls -l > output.txt

echo "فهرست foo.txt" >> output.txt cat foo.txt >> output.txt

ls -l > output.txt

echo "فهرست foo.txt" >> output.txt cat foo.txt >> output.txt


این خیلی سرراست است. سه دستور با خروجی آنها به فایلی با نام هدایت می شوند output.txt. با استفاده از دستور گروه، می‌توانیم آن را به صورت زیر کدنویسی کنیم:


{ ls -l; echo "فهرست foo.txt"؛ گربه foo.txt; } > output.txt

{ ls -l; echo "فهرست foo.txt"؛ گربه foo.txt; } > output.txt


استفاده از زیر پوسته مشابه است:



(ls -l؛ echo "فهرست foo.txt"؛ cat foo.txt) > output.txt

(ls -l؛ echo "فهرست foo.txt"؛ cat foo.txt) > output.txt


با استفاده از این تکنیک، مقداری از تایپ کردن خود را ذخیره کرده‌ایم، اما جایی که یک دستور گروهی یا زیر پوسته واقعاً می‌درخشد، خطوط لوله است. هنگام ساخت یک خط لوله از دستورات، اغلب مفید است که نتایج چندین دستور را در یک جریان واحد ترکیب کنید. دستورات گروهی و زیر پوسته ها این کار را آسان می کنند:



{ ls -l; echo "فهرست foo.txt"؛ گربه foo.txt; } | lpr

{ ls -l; echo "فهرست foo.txt"؛ گربه foo.txt; } | lpr


در اینجا ما خروجی سه دستور خود را با هم ترکیب کرده و آنها را به ورودی وارد کرده ایم لیتر برای تهیه گزارش چاپی

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

/usr/bin:


[me@linuxbox ~]$ آرایه-2 /usr/bin

/usr/bin/2to3-2.6

ریشه

ریشه

/usr/bin/2to3

ریشه

ریشه

/usr/bin/a2p

ریشه

ریشه

/usr/bin/browser

ریشه

ریشه

/usr/bin/aconnect

ریشه

ریشه

/usr/bin/acpi_fakekey

ریشه

ریشه

/usr/bin/acpi_listen

ریشه

ریشه

/usr/bin/add-apt-repository

ریشه

ریشه

.

.

.

/usr/bin/zipgrep

ریشه

ریشه

/usr/bin/zipinfo

ریشه

ریشه

/usr/bin/zipnote

ریشه

ریشه

/usr/bin/zip

ریشه

ریشه


/usr/bin/zipsplit

/usr/bin/zjsdecode

/usr/bin/zsoelim

ریشه ریشه ریشه

ریشه ریشه ریشه

صاحبان فایل: دیمون: 1


فایل ها)

ریشه : 1394

فایل ها)

تصویر

صاحبان گروه فایل: crontab : 1 فایل (ها) دیمون : 1 فایل (ها) lpadmin : 1 فایل (ها) ایمیل : 4 فایل (ها) mlocate : 1 فایل (ها) ریشه : 1380 فایل (ها) shadow : 2 فایل (ها) ssh : 1 فایل

tty : 2 فایل

utmp: 2 فایل


تصویر

#! / bin / bash

#! / bin / bash

# آرایه-2: از آرایه ها برای محاسبه مالکان فایل استفاده کنید

اگر [[ ! -d "$1" ]]; سپس

echo "Usage: array-2 dir" >&2 exit 1

fi


برای i در "$1"/*; do owner=$(stat -c %U "$i") group=$(stat -c %G "$i") files["$i"]="$i" file_owner["$i"]=$ مالک file_group["$i"]=$group ((++owners[$owner])) ((++groups[$group]))

انجام شده


# فایل های جمع آوری شده را فهرست کنید

{ for i در "${files[@]}"; انجام printf "%-40s %-10s %-10s\n" \

"$i" ${file_owner["$i"]} ${file_group["$i"]} انجام شد } | مرتب سازی

# آرایه-2: از آرایه ها برای محاسبه مالکان فایل استفاده کنید

اگر [[ ! -d "$1" ]]; سپس

echo "Usage: array-2 dir" >&2 exit 1

fi


برای i در "$1"/*; do owner=$(stat -c %U "$i") group=$(stat -c %G "$i") files["$i"]="$i" file_owner["$i"]=$ مالک file_group["$i"]=$group ((++owners[$owner])) ((++groups[$group]))

انجام شده


# فایل های جمع آوری شده را فهرست کنید

{ for i در "${files[@]}"; انجام printf "%-40s %-10s %-10s\n" \

"$i" ${file_owner["$i"]} ${file_group["$i"]} انجام شد } | مرتب سازی

در اینجا یک لیست (با شماره خطوط) از اسکریپت آمده است:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


27

28

29

30

31

32

33

34

35

36

37

38

39

40

27

28

29

30

31

32

33

34

35

36

37

38

39

40


تصویر

از دست

از دست

# صاحبان فهرست

echo "صاحبان فایل:"

{ for i در "${!owners[@]}"; انجام دادن

printf "%-10s: %5d فایل(ها)\n" "$i" ${owners["$i"]} انجام شد } | مرتب سازی

از دست


# لیست گروه ها

echo "صاحبان گروه فایل:"

{ for i در "${!groups[@]}"; انجام دادن

printf "%-10s: %5d فایل(ها)\n" "$i" ${groups["$i"]} انجام شد } | مرتب سازی

# صاحبان فهرست

echo "صاحبان فایل:"

{ for i در "${!owners[@]}"; انجام دادن

printf "%-10s: %5d فایل(ها)\n" "$i" ${owners["$i"]} انجام شد } | مرتب سازی

از دست


# لیست گروه ها

echo "صاحبان گروه فایل:"

{ for i در "${!groups[@]}"; انجام دادن

printf "%-10s: %5d فایل(ها)\n" "$i" ${groups["$i"]} انجام شد } | مرتب سازی

بیایید نگاهی به مکانیزم این اسکریپت بیندازیم:

خط 5: آرایه های انجمنی باید با اعلام دستور با استفاده از -A

گزینه. در این اسکریپت ما پنج آرایه به شرح زیر ایجاد می کنیم:

فایل‌ها شامل نام فایل‌های موجود در فهرست هستند، فهرست‌بندی‌شده با نام فایل file_group حاوی مالک گروه هر فایل، فهرست‌بندی‌شده توسط filename file_owner حاوی مالک هر فایل، فهرست‌شده توسط گروه‌های نام فایل حاوی تعداد فایل‌های متعلق به صاحبان گروه فهرست‌شده است. شامل تعداد فایل های متعلق به مالک نمایه شده است

خطوط 7-10: بررسی می کند که یک نام دایرکتوری معتبر به عنوان پارامتر موقعیتی ارسال شده است. اگر نه، یک پیام استفاده نمایش داده می شود و اسکریپت با وضعیت خروج 1 خارج می شود.

خطوط 12-20: فایل های موجود در فهرست را حلقه بزنید. با استفاده از آمار دستور، خطوط 13 و 14 نام صاحب فایل و صاحب گروه را استخراج می کند و مقادیر را به آرایه های مربوطه آنها (خطوط 16، 17) با استفاده از نام فایل به عنوان شاخص آرایه اختصاص می دهد. به همین ترتیب نام فایل به خود اختصاص داده شده است فایل ها آرایه (خط 15).

خطوط 18-19: تعداد کل فایل های متعلق به صاحب فایل و صاحب گروه یک عدد افزایش می یابد.

خطوط 22-27: لیست فایل ها خروجی است. این کار با استفاده از بسط پارامتر "${array[@]}" انجام می شود که به کل لیست عناصر آرایه گسترش می یابد و هر عنصر به عنوان یک کلمه جداگانه در نظر گرفته می شود. این امکان را فراهم می کند که نام فایل ممکن است حاوی فضاهای جاسازی شده باشد. همچنین توجه داشته باشید که کل حلقه در مهاربندها محصور شده است و بنابراین یک فرمان گروهی را تشکیل می دهد. این اجازه می دهد تا کل خروجی حلقه به داخل لوله منتقل شود نوع فرمان این امر ضروری است زیرا گسترش عناصر آرایه مرتب نشده است.

خطوط 29-40: این دو حلقه شبیه حلقه لیست فایل هستند با این تفاوت که از "${!


آرایه[@]}" گسترش می یابد که به جای فهرست عناصر آرایه، به فهرست شاخص های آرایه گسترش می یابد.


 

برترین سیستم عامل Cloud Computing در OnWorks: