GNU/Linux >> Linux の 問題 >  >> Linux

Bashで有効な識別子(関数、変数など)のルールは何ですか?

コマンド識別子と変数名の構文は異なります。変数名は英数字とアンダースコアに制限されており、数字で始まることはありません。一方、コマンド名は、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)

Linux
  1. バッシュシェルが算術オーバーフローなどを警告しない理由は?

  2. 主流の*nixシェル間の基本的な違いは何ですか?

  3. シェル変数の関数?

  1. ターミナルカラーエスケープシーケンスはBashのどこでも定義されていますか?

  2. Bash +正規表現で名前を確認しますか?

  3. 7zip、Xz、Gzip、Tarなど—違いは何ですか?

  1. Bash初心者シリーズ#9:Bashでの関数の使用

  2. スクリプト内の bash シェル スクリプトおよび関数の変数スコープ

  3. Bashでの$#の使用は何ですか