GNU Bash変数定義(主にパス用)の引用スタイルは何ですか? [閉鎖]

GNU Bash変数定義(主にパス用)の引用スタイルは何ですか? [閉鎖]

次の引用スタイルのうち、適切なものは何ですか?GNUグータ変数が好ましい理由は何ですか?

  1. 2つの二重引用符: VAR="/path/$V1/path with space/$V2"
  2. 複数の二重引用符: VAR=/path/"$V1"/"path with space"/"$V2"
  3. コンビネーション: VAR="/path/"$V1"/path with space/"$V2""
  4. その他

ここで好ましい意味は次のとおりです。不必要に冗長ではなく、できるだけ多くの場合に期待どおりに動作します。、問題なく着実に使用できるようにします。 (まれに?)特別な場合がある場合は、ファイルシステムパスに制限してください。

pathセクションにスペースや特殊文字を含めることができるとします。 ~のため2もちろん、これはこれらの部分pathも引用しなければならないことを意味します。

基本的に、これは別の質問に帰結するようです。参照変数の置換だけで追加の操作は実行されますか?

これが本当なら感動を与えるでしょう。2そしてサム(各セクションをスペースとして個別に引用しない場合はpath)そうでない場合は、1最も簡単で好まれるようです。

しかし、ケースを探すここ2これまでで最も一般的ですが、特別なケースは何ですかVAR="$OTHER_VAR"/path/to/something

ベストアンサー1

主な内容は次のとおりです。すべての形式の拡張子またはスペースを含む文字列は二重引用符で囲みます。、そうでない場合は、他の方法を使用できます(例:いつ二重引用符が必要ですか?"). 実際のビットのみを参照するかどうか必要引用符の外に空白ではなく静的空白を引用して保存することは、それほど重要ではありません。

一度に1つずつオプションを見てみましょう。

  1. VAR="/path/$V1/path with space/$V2"

    これは読書に最も簡単なバリエーションです(個人的な意見)。すべての変数拡張は引用され、文字列はスペースに分割されません(引用されるため)。私はこのオプションを使います。

    思い出に残る唯一のことSergiy Kolodyazhnyがコメントで指摘しました。、パス名に実際のリテラル二重引用符文字が含まれている場合は、エスケープするか、二重引用符で囲まれた文字列を\"一時的に終了し、一重引用符"で囲まれた文字列にを挿入して処理する必要があります"this is a string with a "'"'" in it"。同様に、シェルに特殊な他の文字(たとえば、$and\`)は、二重引用符で囲まれた文字列でも同じように処理する必要があります。これはいいえパス名文字列で拡張された変数にこれらの文字の1つが含まれていると、問題が発生します(正しく処理されます)。

  2. VAR=/path/"$V1"/"path with space"/"$V2"

    この(IMHO)は少し汚れているようですが、うまくいきます。スラッシュ間のすべて/ほとんどのパスコンポーネントを二重引用符で囲みます。別のアプローチは、変数を拡張せずに一重引用符を使用することです。

    VAR=/'path'/"$V1"/'path with space'/"$V2"
    

2番目のオプションを使用するのか、1番目のオプションを使用するのかは、あなたと個人的な好み(またはあなたが作業しているプロジェクトでチームが使用するルール)によって異なります。単一のルールを維持し、可能であれば両方のルールを混在させないことをお勧めします。

パス名にシェル関連リテラル文字(単一引用符内では特殊文字ではない)を含めることができることを除いて、2つの「パス名を引用する方法」の間に実質的な違いはありません。使用された引用符の数

あなたも言及しました。

  • VAR="$OTHER_VAR"/path/to/something

    私はこれに全く問題がないと思います。残りのパスが静的でスペースが含まれていない場合に最もよく使用されます。持つ全く違いはありません。これとVAR="$OTHER_VAR/path/to/something"


3番目のオプション:

  1. VAR="/path/"$V1"/path with space/"$V2""

    これをしないでください。実はここには$V1まだ$V2引用しないこれは、変数拡張の周りの二重引用符ビットを終了するためです。

おすすめ記事