シェル スクリプト (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使用するなどして、バックスラッシュが適切に存在するかどうかを確認しなかったことが原因です。echoprint

たとえば、UNIX 準拠モードでは、bash次のechoようになります。

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

\bバックスペース端末に送信すると 1 文字戻る文字です。

あなたはしたい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 の回答に対するコメントが示唆しているように、まったく出力されないことが原因である可能性もありますが、その場合は、Java アプリケーションの問題であり、 の問題ではありませんbash

答え2

試す

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

そして、それを「\」も表示する文字列として保存する必要があります。

関連情報