쉘 스크립팅(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제공됩니다 echo.

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

( \b확장됨백스페이스 키터미널로 전송될 때 한 문자를 다시 설정하는 문자입니다.

당신이 원하는printf임의의 데이터를 출력하는 데 사용됩니다 .(그리고 변수를 인용하는 것을 잊지 마세요):

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

이 출력이 터미널에 도달하면 sed -n l표시되도록 제어 문자나 후행 공백 문자 등을 사용하여 사후 처리해야 할 수도 있습니다.


아니면 해당 백슬래시가 표준 출력에 인쇄되지 않을 수도 있습니다. 예를 들어:

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)"

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

관련 정보