انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: مهدی پیشگوی در 21 تیر 1386، 04:00 ب‌ظ

عنوان: shell script
ارسال شده توسط: مهدی پیشگوی در 21 تیر 1386، 04:00 ب‌ظ
در مورد ساختار زبان برنامه نویسی shell می خواستم اطلاعاتی بهم بدید ممنون میشم
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 22 تیر 1386، 03:20 ب‌ظ
جوابش خیلی زیاده!!!

shell script چیست؟
دستورهای shell که داخل یه فایل می‌نویسیم تا پشت سر هم اجرا بشن (مثل فایل‌های Bat. و Cmd. در MS Dos/Win)
test.sh:
echo "Hello World!"
echo "Salam be jahan!"
برای اجرا باید دستوری مثل sh test.sh بنویسیم
اگه بخوایم که فایل text تبدیل به فایل اجرایی بشه در اول فایل خط
#!/bin/shرو وارد کنیم و فایل رو با دستور
chmod +x test.shبه فایل اجرایی تبدیل کنیم بعد از اون می‌تونیم فایل رو مثل فایل‌های اجرایی دیگه اجرا کنیم:
./test.sh
× اول بگم که هر جا خواستیم به خط جاری پایان بدیم و ادامه‌ی اون رو توی خط بعدی بنویسیم از \ استفاده می‌کنیم:
echo \
"Salam"

× دوم هر کجا که به خط بعد رفتیم معادل ; حساب می‌شه و بلعکس. این دو قسمت معادلند:
if true
then
echo "Condition is true"
fi

if true; then echo "Condition is true"; fi

متغییرها
متغییرها به صورت name=value اختصاص داده می‌شوند و با name$ فراخوانی می‌شوند.
myname="Arman"
echo "My name is $myname"

دستور read
با دستور read می‌تونیم از ورودی متغییرها رو بخونیم
read varname
دستور if
ساختار if به صورت زیر است:
if condition
then commands
[elif condition
then commands]
[else commands]
fi
به جای condition شرط را وارد می‌کنیم و جای commands دستورات رو. قسمت‌های elif و else اختیاری هستند
برای نوشتن conditionهای مختلف از برنامه‌ی test استفاده می‌کنیم به دو صورت می‌تونیم از test استفاده کنیم
test condition
[ condition ]
مثال:
read name

if [ $name = "Arman" ]
then
echo "Your name is Arman"
elif [ $name = "Mehdi" ] # ;)
then
echo "Your name is Mehdi"
else
echo "I dont know you"
fi
پارامترهای مختلف test

دستور test پارامترهای زیادی داره بعضی از اون‌ها رو نوشتم:
exp = عبارت
str = رشته
int = عدد صحیح
file = اسم فایل

!exp
اگر exp غلط باشد (not)

exp1 -a exp2
اگر exp1 و exp2 هردو درست باشند (and)

exp1 -o exp2
اگر exp1 یا exp2 یا هردو درست باشند (or)

str
اگر طول str ناصفر باشد

str1 = str2
اگر str1 برابر str2 باشد

str1 != str2
اگر str1 مخالف str2 باشد

int1 -eq int2
اگر int1 برابر int2 باشد

int1 -nq int2
اگر int1 مخالف int2 باشد

int1 -gt int2
اگر int1 بزرگ‌تر از int2 باشد

int1 -ge int2
اگر int1 بزرگ‌تر یا مساوی int2 باشد

int1 -lt int2
اگر int1 کوچک‌تر از int2 باشد

int1 -le int2
اگر int1 کوچک‌تر یا مساوی int2 باشد

-e file
اگر file وجود داشته یاشد

-d file
اگر file یک دیرکتوری باشد

-f file
اگر file وجود داشته باشد و یک فایل معمولی باشد

برای اطلاعات بیشتر به man test مراجعه کنید

خسته شدم  :) بقیش برای بعد
عنوان: پاسخ به: shell script
ارسال شده توسط: مهدی پیشگوی در 22 تیر 1386، 05:43 ب‌ظ
دستت درد نکنه ممنونم;)
در واقع syntaxی شبیه سی داره درسته ؟ ولی آسونتر مثل پایتون !!
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 23 تیر 1386، 08:07 ب‌ظ
بلوک while
while condition
do commands
done

تا وقتی که condition درست باشد (کد خروجی از اجرا condition صفر باشد) commands اجرا می‌شوند

scrip هر ثانیه یک x رو صفحه می‌گذارد و وقتی تعداد آن‌ها به ۵ رسید حلقه‌ی while به پایان می‌رسه

a=
while [ "$a" != "....." ]
do
a="$a."
echo x
sleep 1
done

× به جای while ! condition می‌توانیم از until confition استفاده کنیم

a=
until [ "$a" = "....." ]
do
a="$a."
echo x
sleep 1
done

بلوک for

for name in list
do commands
done

به ازای هر بار اجرای command متغییر name یکی از مقادیر list رو به خود می‌گیره

این script اعداد ۱ تا ۶ رو می‌نویسه
for number in 1 2 3 4 5 6
do
echo -n "$number "
done
echo

این یکی اسم تمام فایل‌های دیرکتوری جاری رو می‌نویسه
for fn in *
do
echo $fn
done

دستورهای break و continue

با دستور continue دستورهای بعدی حلقه استفاده اجرا نمی‌شود و دوباره به اول حلقه می‌رود
با دستور break دستورهای بعدی حلقه استفاده اجرا نمی‌شود و برنامه از حلقه خارج می‌شود

اگر حلقه‌های تو در تو داریم و می‌خواهیم دو یا چند بار break یا continue کنیم جلوی این دستورات تعداد را وارد می‌کنیم

این script تمام اعداد دو رقمی قبل از ۷۳ را می‌نویسد
for a in 0 1 2 3 4 5 6 7 8 9
do
for b in 0 1 2 3 4 5 6 7 8 9
do
echo "$a$b"

if [ "$a$b" = "72" ]
then
break 2
fi
done
done

بلوک case

case name in
match1) commands ;;
match2) commands ;;
esac

اگر می‌خواهیم مقدارهای مختلف یک متغییر را بررسی کنیم می‌توانیم به جای چندین if از case استفاده کنیم
در صورتی که می‌خواهیم چند مقدار را بررسی کنیم (با یک عبارت) آن‌ها را با | از هم دیگر جدا می‌کنیم مثلا
name|NAME)
   commands
   ;;

echo -n "Enter your command: "
read cmd

case $cmd in

    listFiles)
        ls
        ;;

    showDirectory)
        pwd
        ;;

    calender)
        date
        echo
        cal
        ;;
                           
    *)
        echo "OOoops commands are: listFiles, showDirectory, calender"
        ;;
esac

منتظر بقیش باشین ;)
عنوان: پاسخ به: shell script
ارسال شده توسط: amin در 23 تیر 1386، 08:25 ب‌ظ
خیلی جالب بود . دستت درد نکنه
ویکی کنی بهتر میشه ها  ;)
عنوان: پاسخ به: shell script
ارسال شده توسط: مرد مرده در 23 تیر 1386، 11:07 ب‌ظ
یه سوال بعد اینا رو چجوری اجرا کنیم ؟؟؟   ??? :o
عنوان: پاسخ به: shell script
ارسال شده توسط: مرد مرده در 23 تیر 1386، 11:09 ب‌ظ
یه سوال بعد اینا رو چجوری اجرا کنیم ؟؟؟   ??? :o

یاد گرفتم  ;D با همون sh اجرا میشه !!!  ;)
آخه چرا من اینقدر سر به هوام !!!‌اون بالا که arman_o71  گفته بود که !!!  :o
عنوان: پاسخ به: shell script
ارسال شده توسط: مرد مرده در 24 تیر 1386، 12:16 ق‌ظ
یه pdf راجع به shell scripting گشتم تو آرشیو pdf ای قدیمیم پیدا کردم.
امیدوارم به دردتون بخوره ...
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 24 تیر 1386، 10:41 ق‌ظ
خیلی جالب بود . دستت درد نکنه
ویکی کنی بهتر میشه ها  ;)
حالا بذار تموم بشه
 آخرش ویکی می‌کنم  8)
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 24 تیر 1386، 10:54 ق‌ظ
یه pdf راجع به shell scripting گشتم تو آرشیو pdf ای قدیمیم پیدا کردم.
امیدوارم به دردتون بخوره ...
واسه شروع خوبه
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 25 تیر 1386، 03:05 ب‌ظ

|| و &&
command1 && command2این دستور command1 را اجرا می‌کند و اگر خروجی صفر بود (درست) command2 اجرا می‌شود

[ -f fileName ] && ./fileNameاین قطعه کد (که خیلی استفاده می‌شه) یعنی اگر فایل fileName وجود داشت آن‌را اجرا کن در غیر این صورت کاری انجام نمی‌دهد

* اگر بخواهیم چند کار انجام دهیم آن‌ها رو با {} احاطه می‌کنیم

|| برعکس && هست یعنی اگر خروجی command1 غیر صفر بود command2 اجرا می‌شود

Redirecting

توی shell سه نوع ورودی/خروجی داریم:
۰ - ورودی از keyboard اسم:standard input
۱ - خروجی به console اسم:standard output
۳ - خروجی به console برای خطاها اسم: standard error

× برای توضیح بگم که stderr با stdout هیچ فرقی نداره و فقط برای جداسازی این دوتا هست

[n]> file
خروجی استاندارد یا شماره n را در file می‌ریزد

[n]>> file
خروجی استاندارد یا شماره n را در انتهای file می‌ریزد و آن‌را پاک نمی‌کند

[n]< file
ورودی استاندارد یا شماره n را از file می‌خواند

[n]<> file
فایل file را برای ورودی و خروجی استاندارد یا n باز می‌کند

[n1]>&n2
خروجی استاندارد یا شماره n1 را به n2 می‌فرستد

[n1]<&n2
ورودی استاندارد یا شماره n1 را به n2 می‌فرستد

[n]<&-
ورودی استاندارد یا n را می‌بندد

[n]>&-
خروجی استاندارد یا n را می‌بندد

[n]<< endWord
   write here
   and here
endWord
هرچه بین دو تا endWord نوشته شده باشه رو به ورودی استاندارد یا n می‌فرستد

اگر می‌خواهید از دستور cmd هیچ خروجی روی تصویر نشان داده نشود:
cmd 2>&1 >/dev/null* /dev/null مثل یک سطل آشغال هست هرچی توش بریزین به هیچ جایی نمیره

پایپ
فرض کنیم می‌خواهیم اسم فایل‌های یک دیرکتوری را با ls بگیریم و با sort مرتب کنیم
ls > temp
sort < temp
به جای استفاده از فایل واسطه می‌توانیم مستقیما از خروجی یک دستور خوانده و به ورودی دیگری بدیم با یه پایپ (لوله)!
ls | sort
توابع و پارامترها

توی shell توابع یک نوع برنامه هست و بلعکس!
برای همین همه‌ی مطالب این قسمت (به جز تعریف تابع) برای یک script بدون تابع هم (که خودش یک برنامه است) برقرار است

تعریف تابع

FunctionName()
{
commands
.
.
.
return exitStatus
}

exitStatus یک عدد صحیح است که به هنوان خروجی در نظر گرفته می‌شود

صدازدن تابع

از اون جایی تابع همون برنامه‌س از همون syntax استفاده می‌کنیم
func param1 param2و کد خروجی هم (از اون‌جایی که یه برنامه هست :D) توی متغییر ?$ ذخیره می‌شه
برای کسانی که نمی‌دونن هم بگم هر برنامه یه کد خروجی داره که توی ? ذخیره می‌شه که معمولا نشان دهنده‌ی اینه که برنامه درست اجرا شده یا نه:
arman:~$ ls /
bin   cdrom  etc   initrd      lib         media  opt   root  srv  tmp  var
boot  dev    home  initrd.img  lost+found  mnt    proc  sbin  sys  usr  vmlinuz
arman:~$ echo $?
0
arman:~$ ls /err
ls: /err: No such file or directory
arman:~$ echo $?
2
برای اینکه کد خروج کل shell script رو معین کنیم یا از کل برنامه خارج شویم از تابع exit استفاده می‌کنیم
مثلا
exit 2
پارامترها

پارامتر اول توی 1$، پارامتر دوم توی 2$، ... و پارامتر صفرم توی 0$ ذخیره می‌شه

test.sh:
#!/bin/sh

echo "0 = $0 1 = $1 2 = $2"

arman:~$ ./test.sh hello world
0 = ./test.sh 1 = hello 2 = world

پارامترهای خاص

پارامتر صفرم (0$) همون اسم برنامه هست (به همون طریقی که اجرا شده)
متغییر #$ تعداد پارامترها را مشخص می‌کنه
متغییر @$ شامل تمام متغییرها است که وقتی به string تبدیل می‌شود پارامترها را جداگانه مشخص می‌کند
متغییر *$ شامل تمام متغییرها است که وقتی به string تبدیل می‌شود پارامترها به هم می‌چسبند و بین آن‌ها اولین کاراکتر متغییر IFS هست (که معمولا space هست)
متغییر $$ شماره پروسه shell جاری هست
متغییر !$ شماره پروسه آخرین دستور background یا آخرین پایپ است

ابن مثال خیلی واضح تر از بالاست ;)
test.sh:

#!/bin/sh

echo "0 = $0"
echo "# = $#"
echo "@ = $@"
for a in "$@"; do
    echo $a
done
IFS="/"
echo "* = $*"
for a in "$*"; do
    echo $a
done
echo "\$ = $$"

arman:~$ ./test.sh "hello world" hello2 world2
0 = ./test.sh
# = 3
@ = hello world hello2 world2
hello world
hello2
world2
* = hello world/hello2/world2
hello world hello2 world2
$ = 19750
عنوان: پاسخ به: shell script
ارسال شده توسط: سعید زبردست در 25 تیر 1386، 04:18 ب‌ظ
خیلی خوب بود.
استفاده کردم. بسی حال داد  ;)

ولی اگه ویکی بشه خوبه. اگر دوستان توونستن ویکیش کنن. من الان نمی تونم ویکیش کنم ولی چند روز بعد می تونم ویکیش کنم.

موفق باشی
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 25 تیر 1386، 07:29 ب‌ظ
متشکر
لازم نیست کسی زحمت بکشه خودم ویکی می‌کنم ;)

یواش یواش داریم به قسمت‌های حرفه‌ایش می‌رسیم که خودمم بلد نیستم  :-[  (در حال یادگیری هستم!)
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 25 تیر 1386، 08:48 ب‌ظ
wikied: http://wiki.ubuntu.ir/ShellScripting (http://wiki.ubuntu.ir/ShellScripting)

ولی کاملا چرک نویسه!

پ.ن. بابا پدرم در اومد چیکارش کنم که از چپ به راست بنویسه ???
عنوان: پاسخ به: shell script
ارسال شده توسط: سعید زبردست در 26 تیر 1386، 08:36 ق‌ظ
wikied: http://wiki.ubuntu.ir/ShellScripting (http://wiki.ubuntu.ir/ShellScripting)

ولی کاملا چرک نویسه!

پ.ن. بابا پدرم در اومد چیکارش کنم که از چپ به راست بنویسه ???

sorena زحمتش رو کشید  ;)
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 26 تیر 1386، 04:17 ب‌ظ
wikied: http://wiki.ubuntu.ir/ShellScripting (http://wiki.ubuntu.ir/ShellScripting)

ولی کاملا چرک نویسه!

پ.ن. بابا پدرم در اومد چیکارش کنم که از چپ به راست بنویسه ???

sorena زحمتش رو کشید  ;)
دستشون درد نکنه
ولی من تغییر خاصی ندیدم! (به جز فهرست)

خودم یه کم دیگه بهترش کردم

کسی نیست به ما بگه چه جوری از چپ به راست بنویسیم (شده برعکس همیشه)
عنوان: پاسخ به: shell script
ارسال شده توسط: مهدی پیشگوی در 26 تیر 1386، 08:37 ب‌ظ
مقالتون عالی هستش دستتون درد نکنه ;)
عنوان: پاسخ به: shell script
ارسال شده توسط: Mehdi در 26 تیر 1386، 10:23 ب‌ظ
برای چپ به راست نویسی میتونید از ماکروی [[en]] استفاده کنید و بعد دوباره برای ادامه به فارسی [[fa]] رو استفاده کنید...
مثل:
[[en]]

"Those who would give up Essential Liberty to purchase a little Temporary Safety deserve neither Liberty nor Safety"

http://en.wikipedia.org/wiki/Those_who_would_give_up_Essential_Liberty
[[fa]]
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 27 تیر 1386، 10:17 ق‌ظ
با این درست نشد!
قبلا امتحان کرده بودم مثلا قسمت Redirecting رو نگاه کنید من برای اولیش این ماکرو رو نوشتم ولی باز هم مثل بعدی‌ها شده
عنوان: پاسخ به: shell script
ارسال شده توسط: سعید زبردست در 27 تیر 1386، 11:55 ق‌ظ
با این درست نشد!
قبلا امتحان کرده بودم مثلا قسمت Redirecting رو نگاه کنید من برای اولیش این ماکرو رو نوشتم ولی باز هم مثل بعدی‌ها شده

من قسمت Redirecting رو درست کردم. فقط یه مشکلی داره. وقتی چپ به راست می کنمش میره میفته سمت چپ! مجبور شدم زیرشون خط بکشم که دیدنشون راحت بشه  ;D

فقط یه سوال. چرا اینا رو به صورت کد ننوشتی؟ منظورم داخل }}}{{{ ؟
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 27 تیر 1386، 04:40 ب‌ظ
با این درست نشد!
قبلا امتحان کرده بودم مثلا قسمت Redirecting رو نگاه کنید من برای اولیش این ماکرو رو نوشتم ولی باز هم مثل بعدی‌ها شده

من قسمت Redirecting رو درست کردم. فقط یه مشکلی داره. وقتی چپ به راست می کنمش میره میفته سمت چپ! مجبور شدم زیرشون خط بکشم که دیدنشون راحت بشه  ;D

فقط یه سوال. چرا اینا رو به صورت کد ننوشتی؟ منظورم داخل }}}{{{ ؟
مشکل مال من چی بود؟
براکت ها رو اشتباه زده بودم؟

کد ننوشتم چون کد نبودن :D
می‌خواستم حالت آیتمی داشته باشن نه مثل کد
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 27 تیر 1386، 04:44 ب‌ظ
expr
نمی‌خواستم اینجا توضیح برنامه بنویسم ولی چون این برنامه‌ی معروفی می‌گم:
expr برنامه‌ای هست که جواب یک عبارت رو حساب می‌کنه
کارهایی که می‌کنه مختلفه مثل and و or و بزرگ‌تر و کوچک‌تری و substring و regexp matching و ...
ولی چیزی که همه جا نوشته می‌شه! arithmetic operations (من که مترجم نیستم! عملیات حسابی) هست
arman:~$ expr 4 + 6
10
arman:~$ expr 3 / 2
1
arman:~$ expr 9 - 5
4
arman:~$ expr 8 \* 3
24
همون‌طور که دیدن دو تا نکته هست:
* باید بین عملگر و عملوند فاصله باشه
* عملگر ضرب باید escape بشه که با * All Files قاطی نشه

عملیات حسابی

برای حساب کردن یک عبارت حسابی به جاری استفاده از expr بهتره که از خود shell استفاده کنیم. برای این کار عبارت را به صورت ((exp))$ می‌نویسیم:

arman:~$ echo $((2+5*3-10/2))
12
arman:~$ echo $((2#100))
4
دستور دوم تبدیل مبنا هستش
از expr بهتره مگه نه؟ ولی نمی‌دونم چرا ناشناس باقی مونده

Command Substitution (واقعا منو از ترجمه‌ي این معاف کنید!)

بعضی وقت‌ها می‌خوایم مقدار متغییرها رو برابر خروجی یک برنامه قرار بدیم مثلا می‌خوایم اسم فایل‌های یک دایرکتوری رو توی یک متغییر بریزیم اون وقت باید دستور رو در ()$ قرار بدیم
راه دیگه که معمول‌تر هم هست قرار دادن دستور بین دو تا ` است (backquoting)
arman:~$ a=$(ls /) or a=`ls /`
arman:~$ echo $a
bin boot cdrom dev etc home initrd initrd.img lib lost+found media mnt opt proc root sbin srv sys tmp usr var vmlinuz

بسط پارامترها (Parameter Expansion)

وقتی می‌خواهیم مقدار یک پارامتر (متغییر)‌ رو بدونیم باید بصورت
${parameter}بنویسیم البته {} اختیاری هستند به جز وقتی که پارامترهای عددی بیشتر از یک رقمی داریم یا در بعد از پارامتر کاراکتری وجود دارد که ممکن است جز نام پارامترمحسوب شود

خوب این‌ها رو که بلد بودیم قسمت مهم اعمال بعضی تغییرها روی متغییرها هست

${parameter:-default}
مقدار parameter را برمی‌گرداند اگر parameter مقدار دهی نشده باشد یا null (خالی) باشد مقدار default را برمی‌گرداند

arman:~$ a=Value
arman:~$ echo ${a:-PARAMETER IS NOT SET}
Value
arman:~$ echo ${b:-PARAMETER IS NOT SET}
PARAMETER IS NOT SET

${parameter:=default}
مانند بالا ولی مقدار default به parameter اختصاص داده می‌شود

${parameter:?[message]}
* منظور از براکت‌ها این است که قسمت message اختیاری است
مقدار parameter را برمی‌گرداند اگر parameter مقدار دهی نشده باشد یا null باشد، یک خطا اتفاق می‌افتد که message هم به عنوان پیام خطا نمایش داده می‌شود و با مقدار خروجی غیر صفر خواهد بود

arman:~$ echo ${test:?}
bash: test: parameter null or not set
arman:~$ echo ${test:?Please set test variable}
bash: test: Please set test variable
arman:~$ test='new value'
arman:~$ echo ${test:?Please set test variable}
new value

${parameter:+val}
اگر parameter مقدار دهی نشده یا null باشد مقدار val را برمی‌گرداند در غیر این‌صورت همان null را برمی‌گرداند

در تمام مثال های بالا که از : در آن‌ها استفاده شده می‌توانیم : را پاک کنیم در این‌صورت فقط مقدار دهی شدن مورد بررسی قرار داده می‌شود و null بودن تاثیری ندارد

arman:~$ test=
arman:~$ echo ${test:-is null or not set}
is null or not set
arman:~$ echo ${test-is not set}

arman:~$ unset test
arman:~$ echo ${test:-is null or not set}
is null or not set
arman:~$ echo ${test-is not set}
is not set

${#parameter}
طول رشته‌ی parameter را بر می‌گرداند

${parameter#pattern}
کوچک‌ترین رشته‌ای که با الگوی pattern سازگارست از اول parameter پاک می‌کند

${parameter##pattern}
بزرگترین رشته‌ای که با الگوی pattern سازگارست از اول parameter پاک می‌کند

${parameter%pattern}
کوچک‌ترین رشته‌ای که با الگوی pattern سازگارست از آخر parameter پاک می‌کند

${parameter%%pattern}
بزرگترین رشته‌ای که با الگوی pattern سازگارست از آخر parameter پاک می‌کند

arman:~$ a=000100
arman:~$ echo ${a#+(0)}
00100
arman:~$ echo ${a##+(0)}
100
arman:~$ echo ${a%+(0)}
00010
arman:~$ echo ${a%%+(0)}
0001
arman:~$ a=100
arman:~$ echo ${a##+(0)}
100
عنوان: پاسخ به: shell script
ارسال شده توسط: سعید زبردست در 27 تیر 1386، 04:47 ب‌ظ
با این درست نشد!
قبلا امتحان کرده بودم مثلا قسمت Redirecting رو نگاه کنید من برای اولیش این ماکرو رو نوشتم ولی باز هم مثل بعدی‌ها شده

من قسمت Redirecting رو درست کردم. فقط یه مشکلی داره. وقتی چپ به راست می کنمش میره میفته سمت چپ! مجبور شدم زیرشون خط بکشم که دیدنشون راحت بشه  ;D

فقط یه سوال. چرا اینا رو به صورت کد ننوشتی؟ منظورم داخل }}}{{{ ؟
مشکل مال من چی بود؟
براکت ها رو اشتباه زده بودم؟

کد ننوشتم چون کد نبودن :D
می‌خواستم حالت آیتمی داشته باشن نه مثل کد

قبل و بعد از [[en]] و [[fa]] یه خط خالی رد کن  ;)
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 29 تیر 1386، 02:43 ب‌ظ

ادامه Parameter Expansion

این قسمت از Parameter Expansion مخصوص Bash هست و توی sh کار نمی‌کنه برای همین خط اول  script رو از sh باید به bash تغییر بدین

${parameter:offset[:length]}از رشته‌ی parameter یک زیر رشته از offset به طول length جدا می‌کند اگر length را وارد نکنید تا آخر رشته پیش می‌رود

arman:~$ str="This is a sample string"
arman:~$ echo ${str:2+2}
is a sample string
arman:~$ echo ${str:0:3*3}
This is a

${!parameter}به جای مقدار paramaeter مقدار متغییری که نامش برابر مقدار parameter هست را برمی‌گرداند
arman:~$ fa="Salam"
arman:~$ en="Hello"
arman:~$ greet=en
arman:~$ echo ${!greet}
Hello
arman:~$ greet=fa
arman:~$ echo ${!greet}
Salam

${!param*}
${!param@}
نام تمام متغییرهایی که با param شروع می‌شوند را برمی‌گرداند و با اولین کاراکتر IFS جداسازی می‌کند
arman:~$ a=value
arman:~$ ab=value
arman:~$ afhjd='value is not important'
arman:~$ ah=
arman:~$ echo ${!a*}
a ab afhjd ah

${!parameter[*]}
${!parameter[@]}

* براکت‌ها اختیاری نیستند.
اگر parameter آرایه باشد اندیس‌های آرایه را برمی‌گرداند و اگر متغییر معمولی باشد 0 و اگر تعریف نشده باشد null برمی‌گرداند
arman:~$ arr=(9 8 7)
arman:~$ echo ${!arr[*]}
0 1 2
arman:~$ a='normal'
arman:~$ echo ${!a[*]}
0
arman:~$ echo ${!b[*]}


${parameter/pattern/replace}
اولین زیر رشته‌ای از parameter که با الگوی pattern مطابقت کند را با replace جایگزین می‌کند

${parameter//pattern/replace}تمام قسمت‌هایی از parameter که با الگوی pattern مطابقت کند را با  replcae جایگزین می‌کند

${parameter/#pattern/replace}اگر ابتدای parameter با pattern مطابقت کند آن قسمت با replace عوض می‌شود

${parameter/%pattern/replace}اگر انتهای parameter با pattern مطابقت کند آن قسمت با replace عوض می‌شود

arman:~$ a=salambehame
arman:~$ echo ${a/a/b}
sblambehame
arman:~$ echo ${a//a/b}
sblbmbehbme
arman:~$ echo ${a/#salam/hello}
hellobehame
arman:~$ echo ${a/%salam/hello}
salambehame
arman:~$ echo ${a/%be/hello}
salambehame
arman:~$ echo ${a/%hame/hello}
salambehello
عنوان: پاسخ به: shell script
ارسال شده توسط: Mehdi در 03 امرداد 1386، 11:11 ب‌ظ
من یه تغییر تو css ویکی دادم! از این به بعد برای نوشتن کدها فقط کافیه از {{{ و }}} استفاده کنید و برای اینکه کدها چپ به راست بشه نیازی به استفاده از [[en]] نیست. یعنی کدها به صورت اتوماتیک چپ به راست نوشته میشن!
عنوان: پاسخ به: shell script
ارسال شده توسط: arman_o71 در 04 امرداد 1386، 12:38 ب‌ظ
دستت درد نکنه خیلی بهتر شد
البته من همیشه با sed نوشته‌هام رو به wiki تغییر می‌دادم  :)