コマンド識別子と変数名の構文は異なります。変数名は英数字とアンダースコアに制限されており、数字で始まることはありません。一方、コマンド名は、bash メタ文字を含まないほぼすべての名前にすることができます (メタ文字を引用することもできます)。
bash では、引用符なしで WORD として解析される限り、関数名をコマンド名にすることができます。 (ただし、何らかの理由で整数にすることはできません。) ただし、これは bash 拡張機能です。ターゲット マシンが他のシェル (ダッシュなど) を使用している場合、Posix 標準シェル文法では関数定義形式で「NAME」のみが許可されているため (また、予約語の使用も禁止されているため)、機能しない可能性があります。
質問は「ルール」に関するもので、「ルール」と呼びたいものに応じて、2 つの異なる方法で回答されていますが、どちらもある意味で正しいです。関数名の任意の文字について押し込めるという @rici のポイントを具体化するために、チェックしようとする小さな bash スクリプトを作成しました。 関数名として可能なすべての (0-255) 文字、および関数名の 2 番目の文字:
#!/bin/bash
ASCII=( nul soh stx etx eot enq ack bel bs tab nl vt np cr so si dle \
dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us sp )
for((i=33; i < 127; ++i)); do
printf -v Hex "%x" $i
printf -v Chr "\x$Hex"
ASCII[$i]="$Chr"
done
ASCII[127]=del
for((i=128; i < 256; ++i)); do
ASCII[$i]=$(printf "0X%x" $i)
done
# ASCII table is now defined
function Test(){
Illegal=""
for((i=1; i <= 255; ++i)); do
Name="$(printf \\$(printf '%03o' $i))"
eval "function $1$Name(){ return 0; }; $1$Name ;" 2>/dev/null
if [[ $? -ne 0 ]]; then
Illegal+=" ${ASCII[$i]}"
# echo Illegal: "${ASCII[$i]}"
fi
done
printf "Illegal: %s\n" "$Illegal"
}
echo "$BASH_VERSION"
Test
Test "x"
# can we really do funky crap like this?
function [}{(){
echo "Let me take you to, funkytown!"
}
[}{ # why yes, we can!
# though editor auto-indent modes may punish us
実際には NUL (0x00) をスキップします。これは、bash が入力ストリームでの検出に反対する可能性がある 1 文字であるためです。このスクリプトの出力は次のとおりです:
4.4.0(1)-release
Illegal: soh tab nl sp ! " # $ % & ' ( ) * 0 1 2 3 4 5 6 7 8 9 ; < > \ ` { | } ~ del
Illegal: soh " $ & ' ( ) ; < > [ \ ` | del
Let me take you to, funkytown!
bash では、関数に "[}{" という名前を付けることができます。おそらく、私のコードは、実際の合法性に関する正確なルールを提供するほど厳密ではありませんが、どのような悪用が可能であるかを理解できるはずです。 P>
マニュアルから:
Shell Function Definitions
...
name () compound-command [redirection]
function name [()] compound-command [redirection]
name
は別の場所で定義されています:
name A word consisting only of alphanumeric characters and under‐
scores, and beginning with an alphabetic character or an under‐
score. Also referred to as an identifier.
したがって、ハイフンは無効です。それでも、私のシステムでは動作します...
$ bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)