Bashのコマンド代替宣言構文 - これら2つの方法のどちらが良いですか? [コピー]

Bashのコマンド代替宣言構文 - これら2つの方法のどちらが良いですか? [コピー]

これはfindbashループの一部であり、どちらが構文的に正確であるか、そしてその理由は何であるかを知りたいです。

filename="$(echo "$i" | cut -c5-)";
filename=`echo "$i" | cut -c5-`;

両方の目的はファイル名を取得することです。

答え1

これBash マニュアルには次の内容が記載されています。:

POSIX $() コマンド置換形式が実装されました (参照:コマンドの置き換え)で、Bourneシェルの ``(以前のバージョンとの互換性のために実装されています)よりも優れています。

したがって、作成中の新しいBash関連項目ではSoが$(...)優先されます。`...`バックティック置換はうまく入れ子にされず(エスケープする必要があります)、少し奇妙な引用があります。$(... $(...) ...)好きなだけ入れ子にすることができます。問題ありません。手動二人の行動を次のように描写する。:

古いスタイルのバックティック代替フォーマットを使用する場合、バックスラッシュは、「$」、「`」、または「\」が後に来ない限り、文字通りの意味を維持します。先行バックスラッシュのない最初のバックティックはコマンド置換を終了します。 $(command)形式を使用すると、角かっこ内のすべての文字がコマンドを構成します。

それ通常考える最良の方法は、厳密に要求されない場合を含む単語分離の問題を避けるために、すべての文字列拡張を引用することであるため、ここでも"$(...)"より良い方法です。

最後に、二つの関連部分同じフリースエッジページ:

  • 今あなたも忘れなければならない時です`...`。 Expansionの構文と一致せず、鎮痛剤を使用せずに入れ子にすることは困難です。代わりに使用してください$(...)
  • ください「引用符を使用してください!」文字列とパラメータ拡張を保護します。噴射。正しく引用しないと、スプレーは赤ちゃんを捕まえます。

1実際、これはPOSIXスクリプトでもshベストプラクティスと見なされます。周りにはまだ弱い殻がありますが、遭遇すればわかります。

答え2

VSに関連しないコードの`...`ベストプラクティスの説明$(...)

存在する

filename="$(echo "$i" | cut -c5-)"

少なくとも4つの潜在的な注意事項があります(これを悪用する動機がない限りわずかです)。

  • echoバックスラッシュで始まる値または含めるecho値を使用すると(実装または環境によって)問題が発生する可能性があるため、任意のデータを使用できません。任意のデータを扱う場合に最適です(ここ)。$i-printfprintf '%s\n' "$i"
  • cutほとんどのテキストフィルタリングユーティリティはファイルパスの処理には適していません。すべて彼らの入力ライン。ここでは最初の4文字を削除したいと思います。すべてline $i(改行はファイル名のすべての文字と同じように有効です)。使用するのが最善です(ただし、4文字未満の文字を含む場合filename=${i#????}も考慮することができます)。$i
  • コマンドの置換(`...`または$(...))の削除すべてコマンド出力の末尾の改行文字です。したがって、改行$iで終わったら$filename${i#????}この問題も解決することができます。
  • cut -c5-または${i#????}4つを削除してください数値。一部のロケールでは、1 つの文字を複数の文字で構成できます。バイト。この点を考慮することもできます。 (また参考にしてくださいGNUはcutマルチバイト文字をサポートしていません。しかし(同じ)) cut -ccut -b

関連情報