У меня есть скрипт оболочки, который запускает jar-файл и сохраняет вывод, полученный при запуске jar-файла, в переменную.
Например:
myvariable=$(java -jar MyJavaJarFile.jar)
Однако вывод при выполнении приведенного ниже оператора Java состоит из специальных символов, таких как /, \, +, = и т. д. Но при сохранении в переменной такие символы, как \, опускаются из переменной.
java -jar MyJavaJarFile.jar
Если фактический вывод равен abc=\=abc
, то переменная хранит только abc==abc
.
Может ли кто-нибудь мне помочь с этим? Спасибо.. :)
решение1
Подстановка команд ( $(cmd)
или `cmd`
(также ${ cmd;}
в ksh93)) сохраняет стандартный вывод за cmd
вычетом конечных символов новой строки (если только этот вывод не содержит байты NUL в оболочках, отличных от zsh
).
Он ничего особенного не делает с обратной косой чертой. Единственные символы, с которыми он может ошибиться, это символ NUL (и каждый символ после первого появления NUL в некоторых оболочках) и завершающие символы новой строки.
var=$(printf '%s\n\n\n' 'foo\bar\\baz')
Будет храниться foo\bar\\baz
в $var
.
Если вы не видите эти обратные косые черты, $var
то это может быть связано с тем, что вы не проверили их наличие должным образом, например, с помощью реализации echo
or print
, которая интерпретирует escape-последовательности обратной косой черты.
Например, в режиме соответствия UNIX bash
's echo
дает:
bash-4.3$ echo "$var"
foar\baz
( \b
был расширен довозврат на одну позициюсимвол, который при отправке на терминал возвращает его на один символ назад).
Вы хотитеиспользовать printf
для вывода произвольных данных(и не забудьте заключить переменные в кавычки):
bash-4.3$ printf '%s\n' "$var"
foo\bar\\baz
И когда этот вывод поступает на терминал, вы можете захотеть выполнить его постобработку, чтобы, sed -n l
например, стали видны управляющие символы или конечные пробелы.
Или это потому, что эти обратные косые черты не были выведены на stdout. Например:
foo() {
printf foo
printf '\\' >&2
printf 'bar\n'
}
При запуске этой функции:
bash-4.3$ foo
foo\bar
bash-4.3$ var=$(foo)
\bash-4.3$ printf '%s\n' "$var"
foobar
\
Не дошедшее до него сообщение $var
было выведено в stderr.
Или, конечно, это может быть связано с тем, что они вообще не выводятся, как предполагает ваш комментарий к ответу Бенджо, но тогда это будет проблема вашего приложения Java, а не bash
.
решение2
Пытаться
myvariable="$(java -jar MyJavaJarFile.jar)"
И он должен сохранить его как строку, которая также должна отображать "\"