سؤال كيفية التحقق من عدد الحقول المعطاة لأمر `read`؟


لدي سؤال سريع متعلق $# في النصوص قذيفة.

لذلك ، يمكنني استخدامها $# في سطر الأوامر للتحقق من عدد وسيطات برنامج shell النصية التي يقدمها المستخدم.

مثال:

#  ./shellScript varONE varTWO
#  $#
>  2  <--  so output 2 here reflects varONE and varTWO

هو أي أمر يمكنني استخدامه read أمر؟

فمثلا:

#!/bin/bash
read -p "please input value" var1 var2
echo $#  <--  however here will return 0 even user input two values at command line

هل هناك أي أمر آخر يمكنني استخدامه هنا للعودة 2 حتى أتمكن من إجراء فحص على متغيرات إدخال المستخدم؟ مثل:

[ $# -lt 2 ] && echo "failed"

4
2018-04-21 18:05


الأصل


هل كانت أي من الإجابات مفيدة؟ - jobin


الأجوبة:


أفضل طريقة للتحقق مما إذا كنت قد تلقيت قيمة في varTWO هو التحقق مما إذا كان varTWO فارغ على النحو التالي:

read varONE varTWO
if [[ $varTWO = '' ]]; then
    echo "failed"
fi

4
2018-04-21 18:14



نجاح باهر شكرا جزيلا!!!! - user195661
ليس الاختيار الأول في إذا كان بالية؟ (كيف يمكن أن يكون varONE '' إذا لم يكن varTWO؟) - Rinzwind
Rinzwind: قد يكون varONE '' عندما لا يتم تقديم أي وسيطات وقد يكون varTWO '' عندما يتم توفير وسيطة واحدة فقط. - jobin
@ Rinzwind: أوه نعم ، لست متأكدا ما كنت أفكر بينما كنت أكتب هذا: / - jobin


شل خاص متغير $# إرجاع عدد الوسيطات الموضعية المعطاة لهذا الاحتضار من shell.

إذا كنت تريد أن تكون الوسيطات التي تم تمريرها إلى البرنامج النصي هي بالضبط 2:

if [ $# -ne 2 ]; then
    echo "failed" 
fi

#check if args are correct here...

0
2018-04-21 18:41



كيف يجيب هذا السؤال؟ - jobin
تحقق مما إذا كان عدد الحجج ، ليست هناك حاجة للتحقق مما إذا كانت باطلة. تمرير المناقشة هو الموضعية ، لذلك إذا كان لديك 2 هي بالضرورة صالحة. - girardengo


الإجابة المختصرة هي أنه لا يمكنك ذلك. عليك أن تقول read كم عدد الحجج التي يجب أن تتوقعها ، سوف تقرأ فقط بقدر ما تقول لها. إذا أعطيتها اسم متغير واحد فقط ، فسوف تقرأ كل شىء في هذا المتغير. إذا كنت تعطي أكثر من واحد ، على سبيل المثال 3 ، فإنه سيقرأ كل شيء حتى أول مساحة (أو علامة تبويب ، أو سطر جديد أو أي شيء آخر قمت بتعيينه في $IFS) في 1st ، كل شيء إلى التالي في الثاني وبقية الخط في الثلث. لتوضيح:

$ cat file
one two three four five
$ while read line; do echo "$line"; done < file
one two three four five
$ while read first second rest; do echo "First: $first, Second:$second Rest:$rest"; done < file
First: one, Second:two Rest:three four five

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

كما هو موضح في help read:

خيارات:

- صفيف تعيين الكلمات مقروءة لمؤشرات متسلسلة من الصفيف               متغير ARRAY ، بدءًا من الصفر

هذا يعني أنه يمكنك تخزين قيم الإدخال في صفيف ثم الحصول على طول الصفيف باستخدام ${#ArrayName[@]}:

#!/usr/bin/env bash

read -a values -p "please input values: " 
echo "You gave ${#values[@]} value(s)"

0
2018-04-23 01:03