Скрипт оболочки (Bash): пропускает специальные символы

Скрипт оболочки (Bash): пропускает специальные символы

У меня есть скрипт оболочки, который запускает 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то это может быть связано с тем, что вы не проверили их наличие должным образом, например, с помощью реализации echoor 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)"

И он должен сохранить его как строку, которая также должна отображать "\"

Связанный контент