쉘 스크립트(Bash): 특수 문자 생략

쉘 스크립트(Bash): 특수 문자 생략

jar 파일을 실행하고 jar 파일을 실행하여 생성된 출력을 변수에 저장하는 쉘 스크립트가 있습니다.

예:

myvariable=$(java -jar MyJavaJarFile.jar)

그러나 아래 주어진 java 문을 실행할 때의 출력은 /, \, +, = 등과 같은 특수 문자로 구성됩니다. 그러나 변수에 저장될 때 \와 같은 문자는 변수에서 생략됩니다.

java -jar MyJavaJarFile.jar

실제 출력이 이면 abc=\=abc변수는 abc==abc.

누군가 나를 도와줄 수 있나요? 감사해요.. :)

답변1

명령 대체( $(cmd)또는 `cmd`( ksh93에서도)) 는 후행 개행 문자를 뺀 ${ cmd;}표준 출력을 저장합니다 (해당 출력에 이외의 쉘에 NUL 바이트가 포함되어 있지 않은 경우 ).cmdzsh

백슬래시에는 특별한 기능이 없습니다. 엉망이 될 수 있는 유일한 문자는 NUL 문자(및 일부 쉘에서 첫 번째 NUL 발생 이후의 모든 문자)와 후행 개행 문자입니다.

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

foo\bar\\baz에 저장됩니다 $var.

백슬래시가 표시되지 않으면 백슬래시 이스케이프 시퀀스를 해석하는 또는 구현을 $var사용하여 백슬래시가 제대로 있는지 확인하지 않았기 때문일 수 있습니다 .echoprint

예를 들어 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

\도달하지 못한 것은 $varstderr로 출력되었습니다.


또는 Benjo의 답변에 대한 귀하의 의견에서 알 수 있듯이 전혀 출력되지 않기 때문에 그럴 수도 있지만 이는 bash.

답변2

노력하다

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

그리고 "\"도 표시하는 문자열로 저장해야 합니다.

관련 정보