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引用しないこれは、変数拡張の周りの二重引用符ビットを終了するためです。

答え2

ここで好ましいことは、不必要に冗長ではなく、できるだけ多くの場合に期待どおりに機能することを意味します。

それから最初のものを使用してください。他には望ましくない引用符文字があります。 2つだけ必要です。

$二重引用符の中に特別な意味を持つ文字(たとえば、、、、\または")がたくさんあると、必要な`エスケープがすべて見えなくなります。ただし、ファイル名とパスにはこれらの内容が含まれないことがよくあります。

参照変数の置換だけで追加の操作は実行されますか?

いいえ、"$foo"barのようなものを除いて"${foo}bar"。つまり、中括弧の代わりに引用符を使用して変数名を終了できます。 ("$foobar"もちろん全く違うでしょう。)

答え3

最初のオプションは良く見えますが(残念ながら?)bashのマニュアルには次のように明確に説明されているので、パス名の拡張には機能しません。

次の形式のステートメントを使用して変数を割り当てることができます。

    name=[value]

すべての値は、チルダ拡張、パラメータおよび変数拡張、コマンド置換、算術拡張、および引用符の削除です。 (...)

パス名の拡張は行われません。

重要な例はチルダ拡張です。

var=~/"path/to/dir"       # tilde is expanded to user's home directory
var="~/path/to/dir"       # literal string is substituted

興味深いことに、グロービングメカニズムは二重引用符があるかどうかにかかわらず動作しますbash(デフォルト設定ではそうではありませんzsh)。

関連情報