関数やスクリプト名にアンダースコア「_」の代わりにダッシュ「-」が含まれていると悪くないでしょうか?

関数やスクリプト名にアンダースコア「_」の代わりにダッシュ「-」が含まれていると悪くないでしょうか?

-単語の間にアンダースコアの代わりにダッシュを使用して関数またはスクリプトの名前を指定した方が_良いでしょうか?たとえば、function duplicate-me()またはduplicate-me.sh

Bashでは、変数名にアンダースコアを含めることができますが、ダッシュを含めることはできません。下線の代わりにダッシュを使用して関数とスクリプトの名前を指定すると、bashはそのような名前を変数として解釈しません。そのような名前を変数として誤って使用すると、bashがエラーメッセージを表示することが期待できます。

ありがとうございます。

答え1

移植性が欲しいならダッシュを使うのは良くないし、標準では英数字と下線のみを許可します。そのため、ダッシュがすべてのシェルで機能しない可能性があります。

$ dash -c 'foo-bar() { echo foo-bar; }; foo-bar'
dash: 1: Syntax error: Bad function name

(Busyboxとkshもこれを許可しません。Bash、Zsh、およびmkshは許可します。)

Bashを使用していることがわかっていれば問題ありません。したがって、ダッシュが好きな場合は、関数名にダッシュを使用できます。ただし、変数名の代わりに関数を乱用したくない場合は、eg$foo-barとegの両方が${foo-bar}有効なシェル構文であることに注意してください。最初は変数を展開し、$foo文字列を追加します-bar。 2つ目は値に拡張する$fooか、設定されていない場合は指定された値に拡張しますbar

答え2

POSIXシェル関数名にダッシュを含めることはできません。

[名前] 下線、数字、移植可能な文字セットの文字のみからなる単語です。名前の最初の文字は数字ではありません。

zshbashおよび関数名にダッシュを許可しますが、およびはpdksh許可しません(実際にはPOSIXシェルではありません)。関数名にダッシュを使用しないのが賢明だと思います。fishksh93dashfish

変数と関数は名前空間を共有せず、変数名のPOSIX命名規則はPOSIXシェル関数名と同じです。

スクリプト名には、ダッシュやヌル文字、およびを除く他の文字を含めることができます/。これはファイル名だからです。

答え3

はい、Bashの関数名にダッシュを使用してもかまいません。

これは一例ダッシュを含む関数名のエントリを使用してください。

実際には、関数名には奇妙であると考えられる他の文字が表示されることがあります。これは同じプロジェクトの別のサンプルスクリプト::、一種の名前空間として関数名の一部としてsを使用します。 (しかし、後者は下線を使用し、前者はダッシュを使用するので、一貫性はそれほど強力ではありません...)

@chorobaが述べたように、関数名と変数名の名前空間は別々であるため、名前が2つのいずれかを参照できる場合は実際にはないため、許可されている文字セットが異なるという事実は実際には問題を引き起こしません。名前はそのうちの1つとしてのみ有効であり、無効です。

関連情報