GNU/Linux >> Belajar Linux >  >> Linux

Apa aturan untuk pengidentifikasi yang valid (mis. Fungsi, vars, dll) di Bash?

Pengidentifikasi perintah dan nama variabel memiliki sintaks yang berbeda. Nama variabel dibatasi untuk karakter alfanumerik dan garis bawah, tidak dimulai dengan angka. Nama perintah, di sisi lain, bisa apa saja yang tidak mengandung karakter meta bash (dan bahkan kemudian, mereka dapat dikutip).

Dalam bash, nama fungsi dapat berupa nama perintah, asalkan akan diuraikan sebagai KATA tanpa tanda kutip. (Kecuali, untuk beberapa alasan, mereka tidak boleh bilangan bulat.) Namun, itu adalah ekstensi bash. Jika mesin target menggunakan beberapa shell lain (seperti tanda hubung), itu mungkin tidak berfungsi, karena tata bahasa shell standar Posix hanya mengizinkan "NAME" dalam bentuk definisi fungsi (dan juga melarang penggunaan kata yang dicadangkan).


Pertanyaannya adalah tentang "aturan", yang telah dijawab dengan dua cara berbeda, masing-masing benar dalam arti tertentu, tergantung pada apa yang ingin Anda sebut "aturan". Hanya untuk menyempurnakan poin @rici bahwa Anda dapat mendorong karakter apa pun dalam nama fungsi, saya menulis skrip bash kecil untuk mencoba memeriksa setiap kemungkinan (0-255) karakter sebagai nama fungsi, serta karakter kedua dari nama fungsi:

#!/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

Saya benar-benar melewatkan NUL (0x00), karena itu adalah satu karakter yang mungkin ditolak oleh bash untuk ditemukan di aliran input. Keluaran dari skrip ini adalah:

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!

Perhatikan bahwa bash dengan senang hati memberi saya nama fungsi saya "[}{". Mungkin kode saya tidak cukup ketat untuk memberikan aturan yang tepat untuk legalitas dalam praktik, tetapi harus memberi gambaran tentang jenis penyalahgunaan yang mungkin terjadi. Saya harap saya dapat menandai jawaban ini "Hanya untuk pemirsa dewasa".


Dari manual:

   Shell Function Definitions
       ...
       name () compound-command [redirection]
       function name [()] compound-command [redirection]

name didefinisikan di tempat lain:

       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.

Jadi tanda hubung tidak valid. Namun, di sistem saya, mereka berfungsi...

$ bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)

Linux
  1. Alasan Bash Shell Tidak Memperingatkan Anda Tentang Aritmatika Overflow Dll?

  2. Apa Perbedaan Mendasar Antara Kerang *nix Mainstream??

  3. Bash Seri Pemula #9:Menggunakan Fungsi di Bash

  1. Apa itu Pemisah Kata Readline?

  2. Fungsi Dalam Variabel Shell?

  3. Apakah Urutan Escape Warna Terminal Ditetapkan Di Mana Saja Untuk Bash?

  1. Bash + Verifikasi Nama Dengan Ekspresi Reguler?

  2. 7zip, Xz, Gzip, Tar, Dll — Apa Perbedaannya??

  3. Apa manfaat CloudLinux?