Я написал программу на Java, которая принимает ввод через аргументы командной строки. Я получаю ввод двух чисел и оператора из командной строки. Чтобы умножить два числа, я должен ввести данные, например, 5 3 *, но это работает не так, как написано.
Почему он не принимает * из командной строки?
Переведено автоматически
Ответ 1
Это потому, что * это подстановочный знак оболочки: он имеет особое значение для оболочки, которая расширяет его перед передачей команде (в данном случае, java).
Поскольку вам нужен литерал *, вам нужно экранировать его из командной строки. Точный способ экранирования зависит от вашей командной строки, но вы можете попробовать:
java ProgramName 53"*"
Или:
java ProgramName 53 \*
Кстати, если вы хотите знать, что оболочка делает с *, попробуйте распечатать содержимое String[] args в вашем main методе. Вы обнаружите, что он будет содержать имена файлов в вашем каталоге.
Это может быть удобно, если вам нужно передать некоторые имена файлов в качестве аргументов командной строки.
В Bourne shell (sh) символы звездочки (*) и вопросительного знака (?) являются подстановочными знаками, расширяемыми с помощью глобулирования. Без предшествующего управляющего символа an * будет расширяться до имен всех файлов в рабочем каталоге, которые не начинаются с точки, тогда и только тогда, когда такие файлы есть, в противном случае * останется нерасширенным. Таким образом, чтобы ссылаться на файл с буквальным названием "*", оболочке необходимо указать, чтобы она не интерпретировала его таким образом, поставив перед ним обратную косую черту (\).
Ответ 2
В MS WINDOWS не совсем верно: "java.exe" автоматически расширяет аргументы командной строки с помощью подстановочных знаков
*
?
[abc]
, но только в последнем компоненте, поэтому
a/*/*
работает не так, как вы могли ожидать.
Он также игнорирует записи "." и "..", но учитывает имена других файлов, начинающиеся с ".".
Во избежание недоразумений: если я посмотрю на командную строку запущенного процесса JAVA с помощью PROCEXP, я увижу нерасширенные аргументы!
Я не нашел способа обойти это. Другими словами: пока у вас есть хотя бы один файл или каталог в текущем каталоге, "java Calc 3 * 7" работать НЕ будет!
Это ОЧЕНЬ некрасиво и, кажется, всегда присутствовало во всех версиях JRE вплоть до Java 8 включительно.
У кого-нибудь есть идея, как отключить неприятное расширение командной строки Java?
Ответ 3
* имеет особое значение в интерпретаторах оболочки. Как получить * буквально, зависит от того, какой интерпретатор оболочки вы используете. Для Bash вам следует заключить * в одинарные кавычки, т.е. '*', вместо двойных кавычек типа "*".
Ответ 4
Попробуйте заключить * в кавычки типа "*". Звездочка - это зарезервированный символ в командной строке.