У меня есть быстрый вопрос, относящийся к $#
в сценариях оболочки.
Итак, я могу использовать $#
в командной строке, чтобы проверить количество аргументов сценария оболочки, заданных пользователем.
Пример:
# ./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"
Лучший способ проверить, получили ли Вы значение в Вашем varTWO
, состоит в том, чтобы проверить, пусто ли varTWO
следующие:
read varONE varTWO
if [[ $varTWO = '' ]]; then
echo "failed"
fi
Специальная переменная Shell $#
возвратите количество позиционных параметров, данных этому вызову оболочки.
если Вы хотите аргументы, переданные сценарию, точно 2:
if [ $# -ne 2 ]; then
echo "failed"
fi
#check if args are correct here...
Короткий ответ - то, что Вы не можете. Необходимо сказать 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)"