تحقق من عدد الوسيطات التي تم تمريرها إلى برنامج نصي Bash




parameter-passing (5)

أرغب في كتابة البرنامج النصي Bash لطباعة رسالة خطأ إذا لم يتم استيفاء عدد الوسيطة المطلوب.

حاولت التعليمة البرمجية التالية:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

لسبب غير معروف لديّ الخطأ التالي:

test: line 4: [2: command not found

ما الخطأ الذي افعله؟


إذا كنت مهتمًا بتقديم المساعدة فقط في حالة فقد إحدى الحجج ، فستكون ميزة " استبدال المعلمات" رائعة:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

تماما مثل أي أمر بسيط آخر ، [ ... ] أو test يتطلب مسافات بين الحجج الخاصة به.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

أو

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

عندما تكون في Bash ، يفضل استخدام [[ ]] بدلاً من ذلك لأنه لا يؤدي إلى تقسيم الكلمة وتوسيع اسم المسار إلى المتغيرات الخاصة به التي قد لا تكون عملية الاقتباس ضرورية إلا إذا كانت جزءًا من تعبير.

[[ $# -ne 1 ]]

كما أن لديها بعض الميزات الأخرى مثل تجميع الشرط غير extglob ، ومطابقة النمط (المطابقة الممتدة للنمط مع extglob ) ومطابقة regex.

يتحقق المثال التالي إذا كانت الوسيطات صحيحة. يسمح حجة واحدة أو اثنتين.

[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]

بالنسبة إلى التعبيرات الحسابية البحتة ، قد يكون استخدام (( )) إلى البعض أفضل ، ولكن لا يزال ممكناً في [[ ]] مع مشغلي الحساب مثل -gt أو -ge أو -ge أو -ge أو -ge أو -ge بوضع التعبير كوسيطة سلسلة واحدة:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

يجب أن يكون ذلك مفيدًا إذا كنت تحتاج إلى دمجها مع ميزات أخرى [[ ]] أيضًا.

المراجع:


في حال كنت تريد أن تكون في الجانب الآمن ، فإنني أوصي باستخدام getopts.

هنا مثال صغير:

    while getopts "x:c" opt; do
      case $opt in
        c)
          echo "-$opt was triggered, deploy to ci account" >&2
          DEPLOY_CI_ACCT="true"
          ;;
            x)
              echo "-$opt was triggered, Parameter: $OPTARG" >&2 
              CMD_TO_EXEC=${OPTARG}
              ;;
            \?)
              echo "Invalid option: -$OPTARG" >&2 
              Usage
              exit 1
              ;;
            :)
              echo "Option -$OPTARG requires an argument." >&2 
              Usage
              exit 1
              ;;
          esac
        done

انظر المزيد من التفاصيل هنا على سبيل المثال http://wiki.bash-hackers.org/howto/getopts_tutorial



يمكن استخدام بطانة واحدة بسيطة تعمل باستخدام:

[ "$#" -ne 1 ] && ( usage && exit 1 ) || main

ينقسم هذا إلى:

  1. اختبار متغير bash لحجم المعلمات $ # لا يساوي 1 (عدد أوامرنا الفرعية)
  2. إذا كان صحيحا ثم استدعاء دالة الاستخدام () والخروج بالحالة 1
  3. آخر استدعاء الرئيسي () وظيفة

يفكر في ملاحظة:

  • يمكن أن يكون الاستخدام () مجرد صدى بسيط "$ 0: params"
  • الرئيسية يمكن أن يكون نصي واحد طويل




parameter-passing