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
使用するなどして、バックスラッシュが適切に存在するかどうかを確認しなかったことが原因です。echo
print
たとえば、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
\
到達できなかったものは$var
stderr に出力されました。
または、もちろん、Benjo の回答に対するコメントが示唆しているように、まったく出力されないことが原因である可能性もありますが、その場合は、Java アプリケーションの問題であり、 の問題ではありませんbash
。
答え2
試す
myvariable="$(java -jar MyJavaJarFile.jar)"
そして、それを「\」も表示する文字列として保存する必要があります。