باستخدام getopts داخل المعرفة من قبل المستخدم وظيفة في شركة شل بورن
سؤال
هل من الممكن لتمرير وسائط سطر الأوامر إلى وظيفة من ضمن برنامج نصي بورن، من أجل السماح getopts لمعالجتها.
وحزمت بقية مخطوطتي لطيف في وظائف، لكنها بدأت تبدو مثل سآخذ لنقل وتجهيز حجة في المنطق الرئيسي.
وفيما يلي كيفية كتابته الآن، لكنه لا يعمل:
processArgs() { while getopts j:f: arg do echo "${arg} -- ${OPTARG}" case "${arg}" in j) if [ -z "${filename}" ]; then job_number=$OPTARG else echo "Filename ${filename} already set." echo "Job number ${OPTARG} will be ignored. fi;; f) if [ -z "${job_number}" ]; then filename=$OPTARG else echo "Job number ${job_number} already set." echo "Filename ${OPTARG} will be ignored." fi;; esac done } doStuff1 processArgs doStuff2
هل من الممكن ربما لتحديد وظيفة في الطريقة التي يمكن قراءة النصوص وسائط؟ يمكن أن يتم ذلك بطريقة أخرى؟ أنا أحب وظائف getopts، ولكن يبدو أن في هذه الحالة أنا ذاهب لديك للتضحية جمال رمز للحصول عليه.
المحلول
ويمكنك توفير وسائط لgetopts بعد المتغير. الافتراضي هو $ @، ولكن هذا أيضا ما قذيفة استخدام وظائف لتمثيل <م> من م> الحجج. الحل هو لتمرير "$ @" - تمثل جميع وسائط سطر الأوامر في البرنامج النصي كسلاسل كل على حدة - processArgs:
processArgs "$@"
وإضافة إلى أن السيناريو الخاص بك (وتحديد نقلا في السطر 11)، ومحاولة بعض وسائط اختبار رطانة:
$ ./try -j asdf -f fooo -fasdfasdf -j424pyagnasd j -- asdf f -- fooo Job number asdf already set. Filename fooo will be ignored. f -- asdfasdf Job number asdf already set. Filename asdfasdf will be ignored. j -- 424pyagnasd