Shell Script (Bash): Опускает специальные символы [duplicate]

0
27.09.2016, 11:42
2 ответа

Подстановка команд ( $ (cmd) или `cmd` (также $ {cmd;} в ksh93)) сохраняет стандартный вывод cmd минус завершающие символы новой строки (если этот вывод не содержит байтов NUL в оболочках, отличных от zsh ).

С обратной косой чертой ничего особенного не происходит. Единственные символы, с которыми он может ошибаться, - это символ NUL (и каждый символ после первого вхождения NUL в некоторых оболочках) и завершающие символы новой строки.

var=$(printf '%s\n\n\n' 'foo\bar\\baz')

Сохранит foo \ bar \\ baz в $ var .

Если вы не видите этих обратных косых черт в $ var , это может быть связано либо с тем, что вы не проверили их правильность, например с помощью echo или ] print , которая интерпретирует escape-последовательности с обратной косой чертой.

Например, в режиме соответствия UNIX bash echo дает:

bash-4.3$ echo "$var"
foar\baz

( \ b был расширен до backspace , который при отправке на терминал заставляет его вернуться на один символ назад).

Вы хотите использовать printf для вывода произвольных данных (и не забудьте указать свои переменные в кавычках):

bash-4.3$ printf '%s\n' "$var"
foo\bar\\baz

И когда этот вывод поступает на терминал, вы можете хотите обработать его с помощью sed -nl , чтобы, например, стали видны управляющие символы или символы конечного пробела.


Или это потому, что эти обратные косые черты не выводились на стандартный вывод.Например:

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 .

1
28.01.2020, 02:47

Попробуйте

myvariable="$(java -jar MyJavaJarFile.jar)"

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

0
28.01.2020, 02:47

Теги

Похожие вопросы