Sida 1 av 1
Bash inkluderar små bokstäver i [A-Z]
Postat: 06 jun 2015, 01:37
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:
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.
Re: Bash inkluderar små bokstäver i [A-Z]
Postat: 06 jun 2015, 08:29
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).
Re: Bash inkluderar små bokstäver i [A-Z]
Postat: 06 jun 2015, 09:34
av mcNisse
locale
Visar vad du har för inställningar.
Sent from my Nexus 6 using Tapatalk
Re: Bash inkluderar små bokstäver i [A-Z]
Postat: 06 jun 2015, 10:44
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$
Re: Bash inkluderar små bokstäver i [A-Z]
Postat: 06 jun 2015, 14:46
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.
Re: Bash inkluderar små bokstäver i [A-Z]
Postat: 06 jun 2015, 19:31
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.
Re: Bash inkluderar små bokstäver i [A-Z]
Postat: 07 jun 2015, 12:39
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.
Re: Bash inkluderar små bokstäver i [A-Z]
Postat: 07 jun 2015, 13:20
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.
