Подтвердить что ты не робот

Проблема * в аргументе командной строки

Я написал программу на Java, которая принимает входные данные через аргументы командной строки. Я получаю ввод двух чисел и оператора из командной строки. Чтобы умножить два числа, я должен дать ввод, например. 5 3 *, но он не работает как написанный.

Почему он не принимает * из командной строки?

4b9b3361

Ответ 1

Это потому, что * - это подстановочный шаблон оболочки: он имеет особое значение для оболочки, которая расширяет его, прежде чем передавать его команде (в этом случае java).

Так как вам нужен литерал *, вам нужно вывести его из оболочки. Точный способ экранирования зависит от вашей оболочки, но вы можете попробовать:

java ProgramName 5 3 "*"

Или:

java ProgramName 5 3 \*

Кстати, если вы хотите узнать, что делает оболочка с *, попробуйте распечатать содержимое String[] args по вашему методу main. Вы обнаружите, что он будет содержать имена файлов в вашем каталоге.

Это может быть удобно, если вам нужно передать некоторые имена файлов в качестве аргументов командной строки.

См. также

  • Википедия: glob

    Например, если каталог содержит два файла, a.log и b.log, тогда команда cat *.log будет расширена оболочкой до cat a.log b.log

  • Википедия: символ Escape

    В оболочке Bourne (sh) символы звездочки (*) и вопросительного знака (?) являются подстановочными символами, расширенными с помощью подстановки. Без предшествующего escape-символа * будет расширяться до имен всех файлов в рабочем каталоге, которые не начинаются с периода, если и только если есть такие файлы, в противном случае * остается нерасширенным. Поэтому, чтобы ссылаться на файл, буквально называемый "*", оболочке должно быть сказано не интерпретировать ее таким образом, предшествуя ей обратным слэшем (\).

Ответ 2

* имеет особое значение в интерпретаторах оболочки. Как получить * буквально в зависимости от того, какой интерпретатор оболочки вы используете. Для Bash вы должны поместить одиночные кавычки вокруг *, т.е. '*', Вместо двойных кавычек, таких как "*".

Ответ 3

Попробуйте окружить * кавычками, например "*". Звезда является зарезервированным символом в командной строке.

Ответ 4

В MS WINDOWS не совсем верно: "java.exe" молча расширяет аргументы командной строки с помощью подстановочных знаков

  • *
  • [ABC]

но только в последнем компоненте, поэтому

a/*/*

не работает, как вы можете ожидать.

Он также игнорирует записи ".". и "..", но выполняет другие имена файлов, начиная с ".".

Чтобы избежать недоразумений: если я посмотрю на командную строку запуска JAVA-процесса с помощью PROCEXP, я вижу аргументы нераскрытых!

Я не нашел возможности обойти это. Другими словами: до тех пор, пока у вас есть хотя бы один файл или каталог в текущем каталоге, "java Calc 3 * 7" НЕ будет работать!

Это ОЧЕНЬ уродливый и, кажется, всегда присутствовал во всех версиях JRE вплоть до Java 8.

Кто-нибудь знает, как отключить расширение командной строки Java?

Ответ 5

Используйте одинарные кавычки:

java FooBar 5 3 '*'

Это работает с большинством популярных оболочек (включая bash и ksh).