Переменные из стандартного ввода - PullRequest
1 голос
/ 27 февраля 2012

Я хочу получить ввод от пользователя, используя чтение

read line

, и правильным вводом будет строка, а затем число:

a 5
b 6
+ 87

Как отделить«а» и 5 в две переменные, с 5 в целую переменную?

Ответы [ 4 ]

2 голосов
/ 27 февраля 2012

read поддерживает параметр командной строки -a, чтобы сохранить входные данные в массиве так:

$ read -a line
a 4
$ echo ${line[0]}
a
$ echo ${line[1]}
4

На мой взгляд, это было бы лучше, чем использование двух переменных.

0 голосов
/ 28 февраля 2012

Команда read разделит ваш ввод по всему, что в $IFS По умолчанию это пробел , поэтому просто сделаем это:

read my_string my_number

разделит ваш ввод на две части, разделенные пробелом. Иногда вы увидите это:

read my_string my_number garbage

Потому что read прочитает всю оставшуюся строку в последнюю переменную независимо от того, сколько у вас было параметров. Например, если бы я имел:

read my_string my_number

И пользователь вставил:

this 1 foo foo foo!

$my_string будет this, но $my_number будет 1 foo foo foo!

Помещая другую переменную (в нашем случае garbage), я устраняю эту проблему. Если я поставлю:

read my_string my_number garbage

И пользователь вставил:

this 1 foo foo foo!

$my_string будет this, $my_number будет 1, а $garbage будет foo foo foo!.

Простая тестовая программа:

while read my_string my_number garbage
do
  echo "The string is '$my_string'. The number is '$my_number'."
  echo "Note there's no error checking of input."
  echo "That's your job, Bunky."
done
0 голосов
/ 27 февраля 2012

Я предполагаю, что вы работаете в оболочке, так как этот пост помечен как "bash", но вы можете сделать это явно.

В любом случае, команда «read» для оболочки принимает несколько имен переменных, а не только одно. Вы можете дать ему два, и он передаст вам каждое слово в строке в соответствующих переменных. (Они разделены на разделитель полей, заданный переменной IFS.)

Оболочка на самом деле не имеет никакого различия между "целочисленными" переменными и любым другим видом в общем случае.

Я предлагаю полностью прочитать справочную страницу для оболочки, если вы действительно хотите понять, как правильно писать сценарии оболочки.

0 голосов
/ 27 февраля 2012

Я предлагаю прочитать документацию read, чтобы начать:

help read

Вот первые два абзаца:

Считать строку из стандартного ввода иразбить его на поля.

Считывает одну строку из стандартного ввода или из файлового дескриптора FD, если указана опция -u.Строка разбивается на поля, как при разделении слов, и первое слово присваивается первому ИМЯ, второе слово - второму ИМЯ и т. Д., А все оставшиеся слова назначаются последнему ИМЯ.Только символы, найденные в $ IFS, распознаются как разделители слов.

Обратите внимание, что bash не имеет понятия "целочисленных переменных", сравнимого с другими языками программирования. Переменные Bash являются нетипизированными. Объявление переменной как целого с использованием declare -i влияет только на присваивания этой переменной - все, что не является допустимым целым числом, тихо устанавливается на 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...