シェルスクリプト (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拡張バックスペースキー端末に送信したときに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の答えに対するあなたのコメントからわかるように、出力がまったくないので、そうかもしれませんが、これはbash

おすすめ記事