Bash inkluderar små bokstäver i [A-Z]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
GW_For_President
Inlägg: 5
Blev medlem: 07 maj 2015, 21:13
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS

Bash inkluderar små bokstäver i [A-Z]

Inlägg av GW_For_President »

Hej,

River igång med ett praktiskt exempel.
Säg att det finns fyra filer i en mapp:
> ananas
> Anders
> banan
> Berit

Vill man nu ta bort alla filer med person namn så borde det vara smidigt eftersom endast dom börjar med stor bokstav. Så man skriver in:

Kod: Markera allt

rm [A-B]*
Men underligt nog kommer också banan att tas bort man inte ananas.

Efter lite testande så förefaller det som bash tolkar ex [A-C] som [AbBcC] (liten bokstav kommer före en stor därför är lilla a inte med).

Enligt vad jag kan googla fram så ska det inte funka så och inte heller enligt bash manualen, men så står det såhär:
The sorting order of characters in range expressions is determined by the current locale and the values of the LC_COLLATE or LC_ALL shell variables, if set.
Variablerna tycks jag inte ha, men vad som menas med "current locale" har jag inte riktigt listat ut så det är här det tog stopp.

Är ganska färsk på terminalen men riktigt nyfiken på varför det är såhär.
Användarvisningsbild
webaake
Inlägg: 3962
Blev medlem: 09 maj 2007, 09:46
OS: Xubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Bash inkluderar små bokstäver i [A-Z]

Inlägg av webaake »

Intressant! Här står mer om miljövariabler:
https://help.ubuntu.com/community/EnvironmentVariables

och hur du sätter dem. Den vanlige desktopparen behöver ju inte bry sig i allmänhet (nuförstiden använder de inte terminalen alls, helst).
Xubuntu på flera maskiner. Men inte Unity!
Mer Terminalanvändande i Ubuntu vore bra. Och Xfce. Och Mate.
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

Re: Bash inkluderar små bokstäver i [A-Z]

Inlägg av mcNisse »

locale
Visar vad du har för inställningar.

Sent from my Nexus 6 using Tapatalk
KDE 4.5 SC är ute i det fria!!! Tjoho

Stagnation is good for nobody - after all if you don't progress you end up with gnome
Användarvisningsbild
Gunnar Hjalmarsson
Inlägg: 3030
Blev medlem: 08 aug 2010, 13:49
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Göteborg

Re: Bash inkluderar små bokstäver i [A-Z]

Inlägg av Gunnar Hjalmarsson »

Lustigt exempel. Sorteringsreglerna i olika locales verkar ställa till det i bash.

Gjorde ett par exempel som fungerar:

~/tmp$ locale | grep LC_COLLATE
LC_COLLATE="en_US.UTF-8"
~/tmp$ ls
ananas Anders banan Berit
~/tmp$ sh -c 'ls [A-Z]*'
Anders Berit
~/tmp$ LC_COLLATE=C
~/tmp$ ls [A-Z]*
Anders Berit
~/tmp$
GW_For_President
Inlägg: 5
Blev medlem: 07 maj 2015, 21:13
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS

Re: Bash inkluderar små bokstäver i [A-Z]

Inlägg av GW_For_President »

Tack vare alla er så är det nu löst och har också fått lite bättre förståelse samt några semi relaterade frågor. Vet inte om det är ok att ställa dom i samma tråd eller om man ska starta en ny. Kom gärna med synpunkter på det så blir det rätt nästa gång.

LC_COLLATE=C fungerade visserligen men då sorterar <ls> inte som man är van vid.
~$ sh -c 'ls [A-Z]*' #Fungerade fint samt fann,
~$ ls {A..Z}* # samt,
~$ ls [[:upper:]]*

Allt det här har skapat några följdfrågor:
-----
Kan man på något vis lista alla variabler för
~$ printenv
listade bland annat inte LC_COLLATE.

Vad kan man använda i stället för
~$ echo $VARIABLE
~$ cat $VARIABLE
För inget av dessa lyckades visa LC_COLLATE variabeln.
-----
Finns det någon guide som förklarar hur man använder spann [] och alla varianter av den. Googlade och kollade i glob(7) men allt förutsatte kunskap som jag inte har än.
Användarvisningsbild
Gunnar Hjalmarsson
Inlägg: 3030
Blev medlem: 08 aug 2010, 13:49
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Göteborg

Re: Bash inkluderar små bokstäver i [A-Z]

Inlägg av Gunnar Hjalmarsson »

Vet tyvärr inte vad spann[] är. Det ämnet kanske lämpar sig för en ny tråd. LC_COLLATE-frågan kan jag nog reda ut, och det hänger ju ihop med ursprungsproblemet.

I Ubuntu sätts normalt inte LC_COLLATE-variabeln specifikt, och syns därför inte när du listar miljövariablerna. Däremot sätts alltid variableln LANG, och de LC_*-variabler, som inte har egna värden, 'hämtar' värdet från LANG.

En sida i gettext-dokumentationen beskriver mer om hur det fungerar, och som mcNisse skrev, så kan du köra kommandot locale för att se vilka värden som effektivt används i sessionen. Värdena för de LC_*-variabler, som inte är specifikt satta, visas med citationstecken.

Sidan, som webaake länkade till, är lämplig läsning om du vill fördjupa dig i hur miljövariabler sätts och fungerar mer generellt.
GW_For_President
Inlägg: 5
Blev medlem: 07 maj 2015, 21:13
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS

Re: Bash inkluderar små bokstäver i [A-Z]

Inlägg av GW_For_President »

Då får det bli en ny tråd till den.

Lite lurigt är det att <echo> eller <cat> inte visar variabler som tar sitt värde från en annan variabel, men nu förstår jag i alla fall varför.

Tack för hjälpen.
Användarvisningsbild
Gunnar Hjalmarsson
Inlägg: 3030
Blev medlem: 08 aug 2010, 13:49
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: Göteborg

Re: Bash inkluderar små bokstäver i [A-Z]

Inlägg av Gunnar Hjalmarsson »

GW_For_President skrev:Lite lurigt är det att <echo> eller <cat> inte visar variabler som tar sitt värde från en annan variabel, ...
Det där jag skrev, att tomma LC_*-variabler 'hämtar' värdet från LANG, var nog inte en helt lyckad beskrivning.

Ett program, som hämtar sorteringsreglerna från "locale", kollar först om LC_ALL har något värde. Om inte, undersöks LC_COLLATE, och om inte heller den variabeln är satt (eller har något värde), används sorteringsreglerna i den "locale" som anges i LANG.

Hoppas det blir mindre lurigt med det förtydligandet. :)
Skriv svar

Återgå till "Terminalforum"