وضع إخراج الأمر مع التفاعل داخل متغير أثناء استخدام GREP في باش
سؤال
هذا البرنامج الذي أستخدمه لديه متغيرات خاصة به لتعيينه عند تشغيله، لذلك أريد تعيين هذه المتغيرات ثم Greping الإخراج ثم تخزينه داخل متغير. ومع ذلك، لا أعرف كيف أذهب حول هذه الطريقة الصحيحة. فكرة أنا لا أعمل. التركيز على خطوط 7 إلى 14.
1 #!/usr/local/bin/bash
2 source /home/gempak/NAWIPS/Gemenviron.profile
3 FILENAME="$(date -u '+%Y%m%d')_sao.gem"
4 SFFILE="$GEMDATA/surface/$FILENAME"
5 echo -n "Enter the station ID: "
6 read -e STATION
7 OUTPUT=$(sflist << EOF
8 SFFILE = $SFFILE
9 AREA = @$STATION
10 DATTIM = all
11 SFPARM = TMPF;DWPF
12 run
13 exit
14 EOF)
15 echo $OUTPUT
لكنني أحصل على هذا:
./listweather: line 7: unexpected EOF while looking for matching `)'
./listweather: line 16: syntax error: unexpected end of file
المحلول
وضع إجابات الجميع، جئت عبر حل العمل بنفسي. يعمل هذا الرمز بالنسبة لي:
#!/usr/local/bin/bash
source /home/gempak/NAWIPS/Gemenviron.profile
FILENAME="$(date -u '+%Y%m%d')_sao.gem"
SFFILE="$GEMDATA/surface/$FILENAME"
echo -n "Enter the station ID: "
read -e STATION
OUTPUT=$(sflist << EOF
SFFILE = $SFFILE
AREA = @$STATION
DATTIM = ALL
SFPARM = TMPF;DWPF
run
exit
EOF
)
echo $OUTPUT | grep $STATION
شكرا لكم جميعا!
نصائح أخرى
سأضع برنامجك لتشغيل ملف نصي منفصل .sh، ثم قم بتشغيل البرنامج النصي من ملفك الأول، مما يمر الحجج التي تريد تمريرها كوسائط سطر الأوامر. بهذه الطريقة يمكنك اختبارها بشكل منفصل.
يمكنك أيضا القيام بذلك في وظيفة، لكني أحب عمر البرنامج النصي الثاني. أنا لا أطلب بالضبط ما تحاول فعله أعلاه، ولكن شيء مثل:
runsflist.sh:
#!/bin/bash
FILENAME="$(date -u '+%Y%m%d')_sao.gem"
SFFILE="$GEMDATA/surface/$FILENAME"
AREA = @$STATION
DATTIM = all
SFPARM = TMPF;DWPF
grep $STATION | sflist
main.sh:
#!/bin/bash
echo -n "Enter the station ID: "
read -e STATION
OUTPUT=`runsflist.sh`
echo $OUTPUT
إذا كان SFList يحتاج إلى تفاعل، سأحاول شيئا مثل هذا:
SFFILE=$(
( echo SFFILE = "$SFFILE"
echo AREA = "@$STATION"
echo DATTIM = all
echo SFPARM = TMPF;DWPF
echo run
cat
) | sflist)
لسوء الحظ، عليك الكتابة exit
كجزء من التفاعل.