انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: pronetin در 14 امرداد 1389، 03:23 بظ
-
سلام
من می خواهم یک سری دستورات را بصورت پویا ایجاد کنم.دستوراتی که می خوام اجرا کنم اینا هستند:
cat myfile | cut -d- -f1-5 | grep -v "\-[0-9]"
cat myfile | cut -d- -f1-5 | grep "\-[0-9]" | cut -d- -f1-4 | grep -v "\-[0-9]"
cat myfile | cut -d- -f1-5 | grep "\-[0-9]" | cut -d- -f1-4 | grep "\-[0-9]" | cut -d- -f1-3 | grep -v "\-[0-9]"
cat myfile | cut -d- -f1-5 | grep "\-[0-9]" | cut -d- -f1-4 | grep "\-[0-9]" | cut -d- -f1-3 | grep "\-[0-9]" | cut -d- -f1-2 | grep -v "\-[0-9]"
cat myfile | cut -d- -f1-5 | grep "\-[0-9]" | cut -d- -f1-4 | grep "\-[0-9]" | cut -d- -f1-3 | grep "\-[0-9]" | cut -d- -f1-2 | grep "\-[0-9]" | cut -d- -f1-1 | grep -v "\-[0-9]"
برای ایجاد این دستورات در برنامه ام قطعه کد زیر را نوشته ام:
n=5
while [ $n -ge 1 ]
do
declare -a fnd
#creating cmd to be executed
cmdStr="cat myfile | "
counter=5
cmdStr+="cut -d- -f1-${counter} | "
counter=$(($counter - 1))
while [ $(($counter - $n)) -ge 0 ]
do
cmdStr+="grep \"\-[0-9]\" | "
cmdStr+="cut -d- -f1-${counter} | "
counter=$(($counter - 1))
done
cmdStr+="grep -v \"\-[0-9]\""
printf "To be executed : %s\n" "$cmdStr"
fnd=($($cmdStr))
unset fnd
unset cmdStr
n=$(($n - 1))
done
ولی موقعی که اجرا می کنم، خطای زیر را می دهد:
cat: invalid option -- 'd'
Try `cat --help' for more information.
فکر می کنم مربوط به خط زیر باشد:
fnd=($($cmdStr))
لطفا راهنمایی ام کنید.
-
یه آرایه به اسم fnd تعریف کردی، میخوای به چه شکلی توش ذخیرش کنی؟ کار این آرایه چیه؟
-
دقیقا همون خطه. اگه بخواید یه رشته رو اجرا کنید، به جای اینکه مستقیما اونو اجرا کنید (مثل شما) یا اینکه با کمک بک تیک (`) جواب اون چیزی نیست که میخواید.
به جاش اینطوری بنویسید :
fnd=`eval $cmdStr`
از دستور eval برای همین کار استفاده میشه.(به عبارتی برای اجرای دستورات به صورت پویا )
-
متشکرم از راهنمایتون fzerorubigd
فقط به جای دستوری که شما گفتید، باید از دستور زیر استفاده شود:
fnd=($(eval $cmdStr))
اگر از دستوری که شما گفتید استفاده کنم fnd مقدار داخل ' ' را می گیرد و خروجی دستور را نمی گیرد.
-
به دوتا بک تیک در طرفین دستور توجه کردی؟ اونا کاراکتر ' نیستن ها :) در حقیقت گوشه سمت کلید زیر کلید Esc
اونجوری معادل همینه که شما نوشتی.
-
حق با شما است. متشکرم. :)
-
دوست عزیز، لطفا اگر مشکلت حل شده ،در جهت بالا رفتن نظم انجمن،به عنوان تاپیک یک "حل شد" اضافه کن.