Как проверить количество полей, переданных команде `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
задан 22 April 2014 в 00:13

3 ответа

Лучший способ проверить, получили ли Вы значение в Вашем varTWO, состоит в том, чтобы проверить, пусто ли varTWO следующие:

read varONE varTWO
if [[ $varTWO = '' ]]; then
    echo "failed"
fi
0
ответ дан 22 April 2014 в 00:13

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

если Вы хотите аргументы, переданные сценарию, точно 2:

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

#check if args are correct here...
0
ответ дан 22 April 2014 в 00:13

Короткий ответ - то, что Вы не можете. Необходимо сказать 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 ответ , или можно использовать массивы.

, Как объяснено в help read:

Опции:

-a выстраивают             присвойте чтение слов последовательным индексам МАССИВА переменной типа массив, запускающегося в нуле

, Это означает, что можно сохранить входные значения в массиве и затем получить длину массива с ${#ArrayName[@]}:

#!/usr/bin/env bash

read -a values -p "please input values: " 
echo "You gave ${#values[@]} value(s)"
0
ответ дан 22 April 2014 в 00:13

Другие вопросы по тегам:

Похожие вопросы: