Я записал программу в Java, который принимает вход через параметры командной строки. Я получаю вход двух чисел и оператора из командной строки. Для умножения двух чисел я должен дать вход как, например. 5 3 *
, но это не работает, как записано.
Почему это не принимает *
из командной строки?
Это потому, что *
- это подстановочный знак оболочки: он имеет особое значение для оболочки, которая расширяет его перед передачей команде (в данном случае java
).
Поскольку вам нужен литерал *
, вам нужно экранировать его из оболочки. Точный способ экранирования зависит от вашей оболочки, но вы можете попробовать:
java ProgramName 5 3 "*"
Или:
java ProgramName 5 3 \*
Кстати, если вы хотите знать, что оболочка делает с *
, попробуйте распечатать содержимое String [] args
в ваш метод main
. Вы обнаружите, что он будет содержать имена файлов в вашем каталоге.
Это может быть удобно, если вам нужно передать некоторые имена файлов в качестве аргументов командной строки.
Например, если каталог содержит два файла,
a.log
иb.log
, тогда командаcat * .log
будет расширен оболочкой доcat a.log b.log
В оболочке Борна (
sh
) звездочка (*
) и вопросительный знак (?
) - это подстановочные знаки, расширяемые с помощью подстановки.Без предшествующего escape-символа*
будет расширяться до имен всех файлов в рабочем каталоге, которые не начинаются с точки, если и только если такие файлы существуют, в противном случае*
] остается нерасширенным. Таким образом, чтобы обращаться к файлу с буквальным названием"*"
, оболочке нужно указать, чтобы она не интерпретировала его таким образом, поставив перед ним обратную косую черту (\
).
Попробуйте заключить *
в кавычки, например «*»
. Звездочка - это зарезервированный символ в командной строке.
* имеет особое значение в интерпретаторах оболочки. Как получить * буквально зависит от того, какой интерпретатор оболочки вы используете. Для Bash вы должны заключать * в одинарные кавычки, т.е. '*', вместо двойных кавычек, таких как «*».