パラメータ化されたパラメータエスケープに関する問題

パラメータ化されたパラメータエスケープに関する問題

私の考えでは本物私は非常に明確なものを見逃しているようです。ただし、まったく同じ問題を抱えている既存の質問が見つかりません。

編集しないスクリプトがあり、スペースを含むパラメータを処理するのに問題があります。私は問題を非常に簡単で再現可能なケースに縮小しました。

まず、渡されたコマンドライン引数を出力する簡単なスクリプトを作成しました。

#!/bin/bash
for i; do
    echo $i
done

次に、コマンドラインに渡される環境変数を定義します。

MYOPT="With Space"

これは環境で変更できない部分なので、変数を引数としてコマンドを呼び出します。残念ながら、この変数は私たちの環境では参照されません。

./mycommand.sh $MYOPT

予想通り、出力は次のようになります。

./mycommand.sh $MYOPT
"With
Space"

上記のコマンドで変数を参照すると機能します。他の同様の質問を見ると、これがこの問題について一般的に受け入れられる解決策のようです。

./mycommand.sh "$MYOPT"
"With Space"

ただし、前述したように、このスクリプトの呼び出し方法を変更することはできません。

以下のように環境変数に追加の引用符を追加しようとしましたが、それも役に立ちませんでした。

MYOPT="\"With Space\""
./mycommand.sh $MYOPT
"With
Space"

呼び出しから引用せずにスクリプトに渡すことができるように、この環境変数を空白として定義する方法はありますか?

興味のある方のために、この問題はRHEL7 tomcat環境で発生しました。 JAVA_OPTSはtomcat.confに設定されており、-Dparamaters = "withspaces"があります。 Tomcatに付属のデフォルトの制御スクリプトは、Javaを呼び出すときにこれらのJAVA_OPTSを参照しないため、この問題が発生します。上記の簡単な例で問題を縮小しました。

答え1

あなたできない返された./mycommand.sh $MYOPT値ですMYOPT。だからあなたはそれを行う方法を見つけることができませんでした。それは不可能です。mycommand.sh元の値を再構成するのに十分な情報が受信されませんでした。

たとえば、値がある場合、MYOPT現在のディレクトリに*あるmycommand.shファイル名のリストを使用して呼び出しが行われます。リストがどのように構成されているかを知る方法はありません。

値がMYOPT特定の規則に従うことがわかっている場合そうすれば再建できます。これらのルールの簡単なバージョンは次のとおりです。

  • 値には文字\[*?、タブ、または改行は含まれません。
  • 値は空白で始まったり終わらず、連続した空白も含めません。

これらの仮定の下で、"$*"inはのmycommand.sh値を提供しますMYOPT。しかし、これは一般的には機能しないことに注意してください。

正しい解決策は環境を回復することです。シェル言語では、$MYOPT「酔った値MYOPT」を意味するのではなく、「酔った値」を意味します。MYOPTの値に応じて分割し、IFS各結果部分をワイルドカードパターンとして処理します。少なくとも1つのファイルと一致すると、ワイルドカードパターンは拡大される予定ですMYOPT"$MYOPT"$MYOPT 二重引用符の中

関連情報