Вопрос Как проверить количество полей, заданных команде `read`?


У меня есть быстрый вопрос, связанный с $# в сценариях оболочки.

Итак, я могу использовать $# в командной строке, чтобы проверить количество аргументов сценария оболочки, заданных пользователем.

Пример:

#  ./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) в 1-й, все до следующего во вторую, а остальную часть линии - в третью. Проиллюстрировать:

$ 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's ответ, или вы можете использовать массивы.

Как поясняется в help read:

Опции:

-a array присваивает слова, считываемые последовательным индексам массива               переменная 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