باستخدام getopts داخل المعرفة من قبل المستخدم وظيفة في شركة شل بورن

StackOverflow https://stackoverflow.com/questions/352044

  •  20-08-2019
  •  | 
  •  

سؤال

هل من الممكن لتمرير وسائط سطر الأوامر إلى وظيفة من ضمن برنامج نصي بورن، من أجل السماح 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top