🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#906760
Author: Marcin Debowski
Date: Sat, 17 Dec 2022 02:14
30 lines
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
#906761
Author: Jarosław Sokołowski
Date: Sat, 17 Dec 2022 10:27
20 lines
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
#906762
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 00:58
40 lines
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
#906763
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 07:55
24 lines
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
#906764
Author: Kamil Jońca
Date: Sun, 18 Dec 2022 08:18
50 lines
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
#906765
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 10:44
68 lines
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
#906766
Author: Jarosław Sokołowski
Date: Sun, 18 Dec 2022 11:44
18 lines
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
#906767
Author: Marcin Debowski
Date: Sun, 18 Dec 2022 12:28
28 lines
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