Thread View: pl.comp.os.linux
8 messages
8 total messages
Started by Marcin Debowski
Sat, 17 Dec 2022 02:14
skrypt bash pod Qnap TS-431X2
Author: Marcin Debowski
Date: Sat, 17 Dec 2022 02:14
Date: Sat, 17 Dec 2022 02:14
30 lines
1705 bytes
1705 bytes
Skrypczę ostatnio pod Qnapowskim Linuksem aby ułatwić sobie życie i
natrafiłem na pozornie trywialny problem zmiany pierwszej litery na dużą.
Powłoką jest bash GNU bash, version 3.2.57(2)-release
(arm-unknown-linux-gnueabihf) i takie operacje jak np.:
na ww. nie działa:
NN="banana"; echo "${NN[@]^}"
banana
Co gorsze, sed jest też przerobiony (i sporo innych) i takie coś:
echo "banana"| sed 's/^\(.\)/\U\1/g'
nie zadziała.
tr też nie działa
echo "banana"| tr '[:lower:]' '[:upper:]'
banana
Jakimś cudem awk działa
echo "banana" | awk '{print toupper(substr($0, 1, 1)) substr($0, 2)}'
Banana
ale wolałbym nie używać zewnętrznych poleceń.
Jakieś pomysły jak to zrobić na stringach pod gołym bashem (pierwszy
przykład), czy dla ver<4 się po prostu nie da?
--
Marcin
Re: skrypt bash pod Qnap TS-431X2
Author: Jarosław Sokołowski
Date: Sat, 17 Dec 2022 10:27
Date: Sat, 17 Dec 2022 10:27
20 lines
1632 bytes
1632 bytes
Pan Marcin Debowski skrypci ostatnio pod Qnapowskim Linuksem: > aby ułatwić sobie życie i natrafiłem na pozornie trywialny > problem zmiany pierwszej litery na dużą. > > Powłoką jest bash GNU bash, version 3.2.57(2)-release > (arm-unknown-linux-gnueabihf) i takie operacje jak np.: [...] > tr też nie działa > echo "banana"| tr '[:lower:]' '[:upper:]' > banana Wygląda jakby działał, bo nie zgłasza błędu, tylko te argumenty do niego nie przemawiają. Ja bym przetestował to tak: tr a-z A-Z tr abn ABN -- Jarek
Re: skrypt bash pod Qnap TS-431X2
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 00:58
Date: Sun, 18 Dec 2022 00:58
40 lines
1951 bytes
1951 bytes
On 2022-12-17, Jarosław Sokołowski <jaros@lasek.waw.pl> wrote:
> Pan Marcin Debowski skrypci ostatnio pod Qnapowskim Linuksem:
>
>> aby ułatwić sobie życie i natrafiłem na pozornie trywialny
>> problem zmiany pierwszej litery na dużą.
>>
>> Powłoką jest bash GNU bash, version 3.2.57(2)-release
>> (arm-unknown-linux-gnueabihf) i takie operacje jak np.:
> [...]
>> tr też nie działa
>> echo "banana"| tr '[:lower:]' '[:upper:]'
>> banana
>
> Wygląda jakby działał, bo nie zgłasza błędu, tylko te argumenty
To są jak podejrzewam mocno zmodyfikowane standardowe narzędzia. Ma to
nawet pewne aspekty humorystyczne:
[~] # sed --version
This is not GNU sed version 4.0
> do niego nie przemawiają. Ja bym przetestował to tak:
>
> tr a-z A-Z
[~] # echo "banana"|tr a-z A-Z
BANANA
> tr abn ABN
[~] # echo "banana"|tr abn ABN
BANANA
Dzięki, wolę to niż awk
[~] # N="banana";echo `echo ${N:0:1}|tr a-z A-Z`${N:1}
Banana
--
Marcin
Re: skrypt bash pod Qnap TS-431X2
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 07:55
Date: Sun, 18 Dec 2022 07:55
24 lines
1494 bytes
1494 bytes
Przy okazji jakby mi ktoś mógł wytłumaczyć, bo nie mogę wygóglać... Plik na dysku" Chomik\ Syryjski Taka konstrukcja: (1) for file in * zwraca wartość w file "Chomik Syryjski" ale: (2) fl=`ls -1` for file in $fl zwraca Chomik a Syryjski dopiero w kolejnej iteracji, czyli spacja jest uznawana za separator listy. Dlaczego dla (1) nie? A dalej, jak zrobić, żeby koniec lini był takim separatorem, czyli, żeby lista z ls -1 czy np. find . była separowana po liniach a nie po spacjach? -- Marcin
Re: skrypt bash pod Qnap TS-431X2
Author: Kamil Jońca
Date: Sun, 18 Dec 2022 08:18
Date: Sun, 18 Dec 2022 08:18
50 lines
2276 bytes
2276 bytes
Marcin Debowski <agatek@INVALID.zoho.com> writes:
> Przy okazji jakby mi ktoś mógł wytłumaczyć, bo nie mogę wygóglać...
>
> Plik na dysku" Chomik\ Syryjski
>
> Taka konstrukcja:
> (1)
>
> for file in *
> zwraca wartość w file "Chomik Syryjski"
>
> ale:
> (2)
>
> fl=`ls -1`
> for file in $fl
>
> zwraca Chomik a Syryjski dopiero w kolejnej iteracji, czyli spacja jest
> uznawana za separator listy. Dlaczego dla (1) nie?
Strzelam: w (1) * jest przetwarzana przez bash i on 'wie' że to jest
jedna nazwa pliku. W (2) na zmienną przypisujesz kolejne linie mogące zawierać
spacje, ale dla bash to już jest, well, ciąg lini (niektóre ze spacjami)
- i on tak to traktuje, bez zastanawiania się czy to pliki czy może
nazwy filmów.
zobacz co będzie
IFS="
"
fl=`ls -1`
for file in $fl
(to IFS zawiera znak nowej linii)
>
> A dalej, jak zrobić, żeby koniec lini był takim separatorem, czyli, żeby
> lista z ls -1 czy np. find . była separowana po liniach a nie po spacjach?
Notabene, uważałbym z podejściem:
for q in *
przy długiej liście plików może ci się wyłożyć
lepiej
find ... -exec {} \;
lub ls |xargs czy find ..|xargs
KJ
--
http://wolnelektury.pl/wesprzyj/teraz/
Re: skrypt bash pod Qnap TS-431X2
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 10:44
Date: Sun, 18 Dec 2022 10:44
68 lines
2737 bytes
2737 bytes
On 2022-12-18, Kamil Jońca <kjonca@poczta.onet.pl> wrote:
> Marcin Debowski <agatek@INVALID.zoho.com> writes:
>
>> Przy okazji jakby mi ktoś mógł wytłumaczyć, bo nie mogę wygóglać...
>>
>> Plik na dysku" Chomik\ Syryjski
>>
>> Taka konstrukcja:
>> (1)
>>
>> for file in *
>> zwraca wartość w file "Chomik Syryjski"
>>
>> ale:
>> (2)
>>
>> fl=`ls -1`
>> for file in $fl
>>
>> zwraca Chomik a Syryjski dopiero w kolejnej iteracji, czyli spacja jest
>> uznawana za separator listy. Dlaczego dla (1) nie?
> Strzelam: w (1) * jest przetwarzana przez bash i on 'wie' że to jest
> jedna nazwa pliku. W (2) na zmienną przypisujesz kolejne linie mogące zawierać
> spacje, ale dla bash to już jest, well, ciąg lini (niektóre ze spacjami)
> - i on tak to traktuje, bez zastanawiania się czy to pliki czy może
> nazwy filmów.
>
> zobacz co będzie
> IFS="
> "
> fl=`ls -1`
> for file in $fl
>
> (to IFS zawiera znak nowej linii)
tzn. w sensie:
fl="
jeden dwa
trzy cztery
etc etc"
?
Traktuje spacje i końce linie równorzędnie, tj. daje
jeden
dwa
trzy
cztery
etc
etc
>> A dalej, jak zrobić, żeby koniec lini był takim separatorem, czyli, żeby
>> lista z ls -1 czy np. find . była separowana po liniach a nie po spacjach?
Wygląda, że tak się nie da.
> Notabene, uważałbym z podejściem:
> for q in *
> przy długiej liście plików może ci się wyłożyć
>
> lepiej
> find ... -exec {} \;
> lub ls |xargs czy find ..|xargs
Jo, to było tylko z oszczędności ilustracyjnej :)
--
Marcin
Re: skrypt bash pod Qnap TS-431X2
Author: Jarosław Sokołowski
Date: Sun, 18 Dec 2022 11:44
Date: Sun, 18 Dec 2022 11:44
18 lines
1534 bytes
1534 bytes
Pan Marcin Debowski napisał: >> zobacz co będzie >> IFS=" >> " >> fl=`ls -1` >> for file in $fl >> >> (to IFS zawiera znak nowej linii) [...] > Traktuje spacje i końce linie równorzędnie No to tak: IFS=$ -- Jarek
Re: skrypt bash pod Qnap TS-431X2
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 12:28
Date: Sun, 18 Dec 2022 12:28
28 lines
1721 bytes
1721 bytes
On 2022-12-18, Jarosław Sokołowski <jaros@lasek.waw.pl> wrote: > Pan Marcin Debowski napisał: > >>> zobacz co będzie >>> IFS=" >>> " >>> fl=`ls -1` >>> for file in $fl >>> >>> (to IFS zawiera znak nowej linii) > [...] >> Traktuje spacje i końce linie równorzędnie > > No to tak: > > IFS=$ Wy tu zakładacie, że ja kumam na jakimś rozsądnym poziomie, a to jest niekoniecznie poprawne założenie :) Dopiero powtórzenie Jarka mnie zastanowiło, że to musi być jakaś specjalna zmienna. No działa IFS=" " Dzięki :) -- Marcin
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads