سؤال

كنت أستخدم نصًا سريعًا وقذرًا لأتمتة عملية تقسيم CF.
هذا عمل بشكل جيد حتى أردت أن أضيف إليه.

في الأساس ، لديّ برنامج نصي يقوم بتقسيم فلاش مضغوط على هذا النحو:

CMD=.fdisk
DEV=/dev/sdc

echo "Calculating partition sizes..."
P1SIZE=+1100M
P2SIZE=+1200M

echo "Creating instruction file..."
PT1="n p 1\n $P1SIZE"
PT2="n p 2\n $P2SIZE"
END="a 1 w EOF\n"

[ -e $CMD ] && rm -rf $CMD

for i in $PT1 $PT2 $END; do echo -e $i >> $CMD; done

echo "Creating partitions..."
fdisk $DEV << EOF < $CMD
[ -e $CMD ] && rm -f $CMD

والفكرة هي أنه في المستقبل سيتم إنشاء الملف الذي يمثله "$ CMD" تلقائيًا بواسطة أداة خارجية مع قيم البدء والنهاية المناسبة. الآن أنا ببساطة أقبل البداية الافتراضية وأقدم الحجم.

لقد نجح هذا جيدًا حتى أردت دمج بعض الخطوات الإضافية في البرنامج النصي. لكنني واجهت مشاكل عندما لاحظت سلوكيات غريبة.

الأول هو أنه إذا قمت بإضافة الكود أعلاه داخل وظيفة ، فسوف أستمر في الحصول على خطأ نصوص:

line XX: syntax error: unexpected end of file

أيضًا ، أدركت أن أي رمز إضافي بعد أمر "fdisk" لن يتم تنفيذه ويبدو أن البرنامج النصي ينتهي ببساطة (بدون أخطاء ، $؟ = 0).

هل يعرف أي شخص لماذا لا تعمل الوظيفة وينتهي البرنامج النصي؟

هل كانت مفيدة؟

المحلول

لقد بدأت Heredoc (<< EOF) ، لكنك لا تنهيها في أي مكان.

نصائح أخرى

هناك قاعدة من الإبهام هي أن "سلسلة الحد" التي تستخدمها (كنت أستخدم "EOF" في حالتي ، ولكن يمكنك استخدام أي شيء تريده) يجب ألا يكون لديه مسافات (أو علامات تبويب) أمامها. إذا كان الأمر كذلك ، فلن يعتبر النهاية.

مثال:

myFunction() {
    cat << EOF
        Hello
        World
        EOF
}

يعتبر "EOF" أعلاه نصًا منتظمًا لأنه يحتوي على مسافات أمامه! إذا كتبت ما يلي بدلاً من ذلك:

myFunction() {
    cat << EOF
        Hello
        World
EOF
}

ستعمل الآن!

إذا أصرت على استخدام المساحات ، فيمكنك قمع علامات التبويب باستخدام حرف "-" إلى اليمين المباشر لأحرف "<<".

مثال:

myFunction() {
    cat <<- EOF
        Hello
        World
        EOF
}

لاحظ أن هذا يعمل فقط لعلامات التبويب وليس المساحات! هذا رائع للحفاظ على الكود الخاص بك أكثر قابلية للقراءة.

لاحظ أيضًا أنه إذا اقتبدت من "سلسلة الحد" ، ينتهي بك الأمر إلى تعطيل استبدال المعلمة. لذلك إذا كنت ترغب في كتابة نص لا ينبغي استبداله أو تنفيذه ، فإن هذا يجعل الأمر ممكنًا:

cat << "EOF"
    Type `ls -la` at the command prompt
EOF
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top