$ VARと$ {VAR}を比較し、引用するかしないか



Var Vs Quote



解決:

VAR = $ VAR1は、の簡略版です。VAR = $ {VAR1}。たとえば、配列インデックスを参照する(移植性がない)、または部分文字列を削除する(POSIX-移植可能)など、2番目にできることは最初にできないことがあります。 POSIX仕様の「初心者向けBashガイドとパラメーター拡張」の「変数の詳細」セクションを参照してください。

のように変数を引用符で囲むrm-'$ VAR1'またはrm-'$ {VAR}'は良い考えです。これにより、変数の内容が原子単位になります。変数値に空白が含まれている場合(まあ、$ IFS特殊変数、デフォルトでは空白)またはグロブ文字であり、引用符で囲まない場合、各単語はファイル名の生成(グロブ)の対象と見なされ、その展開により、実行していることに対して多くの引数が作成されます。



$検索。 。 ./*r* ./-rf ./another ./filename ./spaced filename./anotherspacedfilename./anotherspacedfilename/x$var='spacedfilename'#通常、 'spacedfilename'は出力から取得されますいくつかのコマンドの、そしてあなたはそれを期待していませんでした$ rm $ var rm: 'spaced'を削除できません:そのようなファイルやディレクトリはありません#おっと! 'rm間隔のファイル名' $ var = '* r *' $ rm $ var#を実行しました: 'rm' '-rf' '* r *' '別の間隔のあるファイル名' $ find。 。 ./another./spacedfilename./anotherspacedfilename $ var = 'anotherspaced filename' $ rm-'$ var' $ find。 。 ./another./spacedファイル名

移植性について:POSIX.1-2008セクション2.6.2によると、中括弧はオプションです。


{{VAR}と$ VARはまったく同じです。単純な変数展開の場合、使用する唯一の理由$ {VAR}は、解析によって変数名に多くの文字が取り込まれる場合です。$ {VAR1} _ $ VAR2(中かっこなしの場合は$ {VAR1 _} $ VAR2)。最も飾られた拡張($ {VAR:=デフォルト}、$ {VAR#prefix}、…)中括弧が必要です。



変数の割り当てでは、フィールドの分割(つまり、値の空白での分割)とパス名の展開(つまり、グロブ)がオフになっているため、VAR = $ VAR1はとまったく同じですVAR = '$ VAR1'、すべてのPOSIXシェル、および私が聞いたすべてのPOSIX以前のsh。 (POSIX ref:単純なコマンド)。同じ理由で、VAR = *は確実に設定しますリテラル文字列へのVAR*;もちろんVAR = abセット2つだった以来bはそもそも別の言葉です。一般的に言って、シェル構文が単一の単語を期待する場合、二重引用符は不要です。case…in(ただし、パターンではありません)ですが、注意する必要があります。たとえば、POSIXはリダイレクトターゲットを指定します(> $ filename)はスクリプトで引用符を使用する必要はありませんが、bashを含むいくつかのシェルでは、スクリプトでも二重引用符を使用する必要があります。二重引用符が必要なのはいつですか?を参照してください。より徹底的な分析のために。

他の場合、特に次の場合は二重引用符が必要です。export VAR = '$ {VAR1}'(これは同等に記述できます多くのシェルで 'VAR = $ {VAR1}')をエクスポートします(POSIXはこのケースを開いたままにします)。このケースと単純な割り当てとの類似性、および二重引用符を必要としないケースのリストの分散性により、分割してグロブする必要がない限り、二重引用符を使用することをお勧めします。


引用

変数の拡張にはダブルクォートが使用され、ストロングクォート、つまり拡張なしにはシングルクォートが使用されることを考慮してください。



拡張:

this = 'foo' that = 'bar' these = '$ this' these = '$ that'

出力:

'$ this' '$ that' '$ these' '$ those'のアイテムの場合;エコーする '$ item'; foo bar foo $ thatを実行しました

いくつかの理由から、可能な限り引用を使用する必要があることを言及する価値があるかもしれません。その中で最も優れているのは、ベストプラクティスと見なされていることと読みやすさです。また、Bashは時々、一見非論理的または不合理/予期しない方法で風変わりであり、引用は暗黙の期待を明示的に変更し、そのエラー面(またはその潜在的な可能性)を減らします。

そしてそれは完全に合法ですが いいえ 引用し、ほとんどの場合に機能しますが、その機能は便宜上提供されており、おそらく移植性が低くなっています。意図と期待を反映することが保証されている完全に正式な慣行は引用することです。

置換

ここで、構成が'$ {somevar}'は置換操作に使用されます。置換や配列など、いくつかのユースケース。

交換(ストリッピング):

thisfile = 'foobar.txt.bak' foo = '$ {thisfile%。*}'#右側のbar = '$ {thisfile %%。*}'#から '%'の後に一致する$ thisfileの値の最短部分を削除します。 '$ foo' '$ bar'内のアイテムの最長一致を削除します。エコーする '$ item'; foob​​ar.txtfoobarを実行しました

交換(交換):

foob​​ar = '最も単純、最も効果が低く、最も強力ではない'#$ {var / find / replace_with} foo = '$ {foobar / left / most}'#単一のオカレンスbar = '$ {foobar // less / most}' #global '$ foobar' '$ foo' '$ bar'内のアイテムのオカレンス(すべて);エコーする '$ item';最も単純、最も効果が低く、最も強力でない最も単純、最も効果的、最も強力でない最も単純、最も効果的、最も強力

配列:

mkdir temp#tempフォルダーにファイルfoo.txt、bar.txt、foobar.txtを作成touch temp / {foo、bar、foobar} .txt#alphaはlsからの出力の配列alpha =($(ls temp / *)) echo '$ alpha'#temp / foo.txt echo '$ {alpha}'#temp / foo.txt echo '$ {alpha [@]}'#temp / bar.txt temp / foobar.txt temp / foo.txt echo '$ {#alpha}'#12#最初の要素の長さ(暗黙のインデックス[0])echo '$ {#alpha [@]}'#3#要素の数echo '$ {alpha [1]}'# temp / foobar.txt#2番目の要素echo '$ {#alpha [1])'#15# '$ {alpha [@]}'内のアイテムの2番目の要素の長さ;エコーする '$ item';完了temp / bar.txt temp / foobar.txt temp / foo.txt

これらはすべて、表面をかろうじて引っ掻いているだけです。'$ {var}'置換コンストラクト。 Bashシェルスクリプトの最も信頼のおけるリファレンスは、libreオンラインリファレンスTLDP The Linux DocumentationProjectです。https://www.tldp.org/LDP/abs/html/parameter-substitution.html