GNU/Linux >> Belajar Linux >  >> Linux

bash - pencocokan variabel case-insensitive

Standar sh

Tidak perlu menggunakan ksh itu -gaya [[...]] perintah, Anda dapat menggunakan sh standar case bangun di sini:

case $LINUX_CONF in
  ([Nn][Oo]) echo linux;;
  (*)        echo not linux;;
esac

Atau menamai setiap kemungkinan kasus satu per satu:

case $LINUX_CONF in
  (No | nO | NO | no) echo linux;;
  (*)                 echo not linux;;
esac

pesta

Untuk bash -cara khusus untuk melakukan pencocokan case-insensitive, Anda dapat melakukan:

shopt -s nocasematch
[[ $LINUX_CONF = no ]] && echo linux

Atau:

[[ ${LINUX_CONF,,} = no ]] && echo linux

(di mana ${VAR,,} adalah sintaks untuk mengubah string menjadi huruf kecil).

Anda juga dapat memaksa variabel untuk dikonversi menjadi huruf kecil setelah penugasan dengan:

typeset -l LINUX_CONF

Itu juga berasal dari ksh dan juga didukung oleh bash dan zsh .

Lebih banyak varian dengan cangkang lain:

zsh

set -o  nocasematch
[[ $LINUX_CONF = no ]] && echo linux

(sama seperti di bash ).

setopt extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux

(kurang berbahaya daripada membuat semua cocok dengan huruf besar-kecil)

[[ ${(L)LINUX_CONF} = no ]] && echo linux

(ubah menjadi operator huruf kecil)

set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)no\z' ]]

(sintaksis PCRE)

ksh93

[[ $LINUX_CONF = ~(i)no ]]

atau

[[ $LINUX_CONF = ~(i:no) ]]

Perhatikan bahwa semua pendekatan di atas selain [nN][oO] untuk melakukan pencocokan peka huruf besar-kecil bergantung pada lokal pengguna. Tidak semua orang di seluruh dunia setuju dengan versi huruf besar dari huruf tertentu, bahkan untuk huruf ASCII.

Dalam praktiknya untuk yang ASCII, setidaknya pada sistem GNU, penyimpangan dari aturan bahasa Inggris tampaknya terbatas pada i dan I huruf dan apakah titik ada atau tidak pada versi huruf besar atau kecil.

Artinya adalah [[ ${VAR,,} = oui ]] itu tidak dijamin cocok dengan OUI di setiap lokal (bahkan ketika bug di versi bash saat ini sudah diperbaiki).


Pertahankan perintah Anda yang sudah ada tetapi pada baris sebelum menjalankan ini:

LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')

Terlepas dari kasus nilai yang disimpan dalam variabel Anda, ini akan memaksa nilai pengganti menjadi huruf kecil. Ini menghasilkan pencocokan perintah yang ada dengan hanya satu baris kode tambahan.


Linux
  1. Skrip bash(I)

  2. Nama Variabel Bash Dinamis (variabel)?

  3. Mengapa Mengatur Variabel Sebelum Perintah Legal Di Bash?

  1. Menggunakan Referensi Ke Variabel Bash String Di Sed?

  2. Gumpalan peka huruf besar-kecil pada zsh/bash

  3. Bagaimana cara menguji apakah suatu variabel adalah angka di Bash?

  1. Linux bash:Penetapan variabel berganda

  2. Alias ​​​​dengan variabel di bash

  3. meneruskan grep ke dalam variabel di bash