Počítačové hře Doom je dnes 30 let. Vydána byla 10. prosince 1993. Zahrát si ji lze také na Internet Archive.
V srpnu společnost HashiCorp přelicencovala "své produkty" Terraform, Packer, Vault, Boundary, Consul, Nomad a Waypoint z MPL a Vagrant z MIT na BSL (Business Source License). V září byl představen svobodný a otevřený fork Terraformu s názvem OpenTofu. Na konferenci Open Source Summit Japan 2023 byl představen (YouTube) svobodný a otevřený fork Vaultu s názvem OpenBao (GitHub).
Na dnes plánované vydání Debianu 12.3 bylo posunuto. V jádře 6.1.64-1 v souborovém systému ext4 je chyba #1057843 vedoucí k možnému poškození dat.
Na čem aktuálně pracují vývojáři GNOME a KDE? Pravidelný přehled novinek i s náhledy aplikací v Týden v GNOME a Týden v KDE.
Tak od ledna linuxové terminály, výchozí pozadí i celé desktopy v barvě "broskvového chmýří", v barvě "jejíž všeobjímající duch obohacuje mysl, tělo i srdce". Barvou roku 2024 je PANTONE 13-1023 Peach Fuzz.
Byla vydána verze 10 linuxové distribuce Freespire (Wikipedie). Jedná se o bezplatnou linuxovou distribuci vyvíjenou společností PC/OpenSystems LLC stojící za komerční distribucí Linspire (Wikipedie), původně Lindows.
Binarly REsearch před týdnem informoval o kritických zranitelnostech UEFI souhrnně pojmenovaných LogoFAIL. Tento týden doplnil podrobnosti. Útočník může nahradit logo zobrazováno při bootování vlastním speciálně upraveným obrázkem, jehož "zobrazení" při bootování spustí připravený kód. Pětiminutové povídání o LogoFAIL a ukázka útoku na YouTube.
Byla vydána listopadová aktualizace aneb nová verze 1.85 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.85 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
git.kernel.org je nově oficiálně také v tmavém vzhledu.
Richard Hughes na svém blogu oznámil, že počet aktualizací firmwarů pomocí služby LVFS (Linux Vendor Firmware Service) přesáhl 100 milionů. Přehled podporovaných zařízení, nejnovějších firmwarů nebo zapojených výrobců na stránkách LVFS.
Ahoj, tak jsem tady po krátké době zas. Pokusím se ve stručnosti nastínit svůj problém. Načítám si parametry zadané uživatelem, co parametr to buď metoda pro řazení slov nebo název souboru. Tyto soubory v jednoduchém forcyklu načítám do své proměnné a pak dalším forcyklem zpracovávám výpis těch txt souborů do další proměnné. Jenže problém když uživatel zadá název souboru ve kterém je mezera, nebo i když zadá soubor co se jmenuje (mezera).txt
for i in `seq 1 $# ; do parametry="$parametry $1" shift done
Takhle si načítám ty jednotlivé parametry zadané uživatelem.
Pak v dalším forcyklu vypisuji obsah těch souborů , to myslím není klíčové. Problém bude tady.
Zkoušel jsem tam nějak uplatnit IFS ale to se minulo účinkem Neporadil by někdo?
Předem děkuji za jakékoliv rady.
Řešení dotazu:
Já se fakt už omlouvám , nevyspání dělá svoje :( Pak dále ty hodnoty parametrů převadím do pole
PARAMETR=( $PARAMETRY ) když zde doplním úvozovky tak to nepomůže
Fakt se omlouvám za komplikace ale tohle už je snad všechno ,snad jsem už nic nezapomněl
Pokud ti zbývají v parametrech jen názvy souborů (shift znáš :)) a chceš přes ně udělat jen jeden cyklus, tak prostě něco jako for soubor in "$@"; do
. For cyklus v bashi je přes "množinu", ne "numerický" jako v C. Tudíž bys měl do něj číselný rozsah generovat pouze tehdy, když to opravdu potřebuješ (což většinou nepotřebuješ) a jinak iterovat přímo přes to, co chceš (názvy souborů atd.).
Druhá věc je, že podle tvého popisu to vypadá, že všechny soubory z parametrů spojuješ dohromady za sebe. K tomu přeci služí příkaz cat
bez jakéhokoliv cyklu.
Když se nad tím trochu zamyslíš, tak pak můžeš celý další úkol provést v pipe za tím cat. (hint: sort
, sort -g
, uniq -c
a nakonec něco na úpravu výstupu do požadoané podoby -- cut, sed apod.)
Mno teoreticky by v téhle časti měli zbývat už jen názvy souborů bez řadících parametrů. For cyklus ,že je přes množinu jsem po mnoha desítkách minut googlení taky vykoumal
Ano všechny soubory spojím do jedné proměnné a pracuji se všemi najednou.
Ten cat mám v tom dalším forcyklu , forcyklus jede do hodnoty o 1 menší než je počet parametrů (jinak to nefungovalo ) a v tom forcyklu je to napsané takto:
TEXT=$TEXT" ""`(cat ${PARAMETR[$i]} | tr '[:upper:]' '[:lower:]')`"
V Bashi jsem naprostý nevzdělanec ,tak to možná řeším příliš složitě Program je odhadem tak na 80 řádků zatím
Hm, unikl ti smysl příkazu cat. :) Slouží ke spojení souborů, ne k vypsání jednoho souboru (OK, je to na dlouhou diskuzi, ale výhledově se zeptej googlu na "useless use of cat" či něco podobného).
Takový hint na jeden řádek v bashi, co neřeší přepínače, ale jinak se blíží k tomu, co chceš:
cat "$@" | sort -u;
Nic víc, prostě jen tenhle jeden řádek. :)
Mimochodem, není úplně rozumné ukládat do proměnných moc dat (celý obsah souboru). Můžeš narazit na různé problémy související s limitem environment size (při spouštění podprocesů apod.), záleží to na platformě, ale obecně je dobré se snažit držet do kB, ono je i z jiných důvodů rozumné používat na velká data roury.
S tím catem jsem se spletl Já už se asi zase ztratil... Ten řádek jestli jsem dobře pochopil tak to spojí všechny soubory zadané parametrem a seřadí je to pomocí unique , nebo kecám?
Já z těch parametrů potřebuju vyhodit ty parametry pro řazení aby mi to pak nepsalo chybu:
cat: -a Adresář nebo soubor neexistuje
cat: -r Adresář nebo soubor neexistuje
Ale to mi stále neřeší problém s těma mezerama ne?
Jinak se mi zdá taky podivné to cpát do proměnné , ale je to tak zadané a musím se tomu přízpusobit, podle mě by bylo lepší mít nějaký můj pomocný txt soubor.
To vyřazení těch přepínačů jsem řešil takto:
for i in `seq 1 $#` ; do
PARAMETR="PARAMETRY $1"
shift
done
PARAMETRY=${PARAMETRY#*-r}
PARAMETRY=${PARAMETRY#*-a}
Mohu to tady řešit stejně? Nebo na to budu muset jít jinak?
getopts
, zpracoval parametry a odstranil pomocí shift
u. Z příkazové řádky zbude jen seznam souborů, stačí tedy cat "$@"|dalsi_zpracovani
Máš nějaký důvod, dělat nejprv ze všech parametrů jeden string a pak jej zpátky sekat do pole? Asi by šlo whitespace nějak pořešit i takhle, ale bude to úděsný opruz.
Pokud chceš dostat všechny parametry z cmdline do pole, stačí ti v bashi úplně jednoduchá řádka: pole=("$@");
Zkus poslat ukázku, co ti nefunguje. Tohle fuguje:
# cat pokus.sh
#!/bin/bash
a=("$@")
echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]}"
# ./pokus.sh prvni "druhy s mezerou" tre\ ti ctvrty
Parametry: prvni -- druhy s mezerou -- tr eti
Tak jsem to opsal stejně jako Vy, a funguje to, ale zůstal problém s mezerou. Když tam zkusím cvičně zadat například soubor s mezerou.txt tak mi ho to rozseká na:
soubor
s
mezerou
Dobře , já nikdy v odborných diskuzích na úrovni nevím jestli vykat nebo tykat
Jak při volání scriptu v úvozovkách? Script volám takto: ./Ultrabeta.sh Pokus.txt Soubor s mezerou.txt
Vím ,že je asi prasárna to zadávat takto ,ale pokud se nemyslím tak na takovémhle příkladu to chtějí testovat v automatickém odevzdávacím systému.
for soubor in $*; do
anebo řetězením do jednoho stringu.
Tak jsem se dostal ke svému linuxovému stroji a zkouším dál tak už snad umím zpracovat mezeru.
Ale dostal jsem se do problému s odstraněním těch přepínačů nebo jak se tomu správně nadává.
chtěl jsem to řešit pomocí dvou if cyklů ve smyslu ,že pokud je v 1.parametru -a nebo -r tak smaž první pozici pole, druhý if pokud je 2.parametr -a nebo -r tak smaž druhou pozici pole...
Dělal jsem to pomocí unset ${a[0]} tuto syntaxi jsem našel na internetu.... Manuálová stránka pro to není.
Je moje myšlenka správná? Nebo nedělat pomocí unsetu a ifů ?
a=("$@")
echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]} -- ${a[3]} -- ${a[4]} -- ${a[5]}"
if [ "$1" = '-a' ] | [ "$1" = 'r'] ; then
unset ${a[0]}
fi
if [ "$2" = '-a' ] | [ "$2" = 'r'] ; then
unset ${a[1]}
fi
echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]} -- ${a[3]} -- ${a[4]} -- ${a[5]}"
Prostě IF (asi ne if cyklus). Myslel jsem že takto to bude nejjednodušší, to pole parametrů jsem použil jak radil kolega výše. Nebo jsem ho špatně pochopil?
Ale asi jsem nedomyslel, že to možná povede k chybě
Manuálové stránky se snažím používat, ale třeba pro příkaz unset tam není vůbec nic
cat "$@"a tím se všechny soubory spojí a dají se přesměrovat kamkoli. Už jsem to tady psal.
cat "$@"
tu padlo poprvé ode mne. :)
"$@" tohle mi v pohodě bere snad i mezery Ale furt nechápu jak myslíš ten while.
Kam si to budu ukládat nebo jak to pak zpracuji?
while ["$@" = "-#"]
do a=("$@")
shift
done
nebo na to jdu úplně špatně? Já nevím jak si asi vyjádřít jestli jsem ještě u přepínače nebo už u názvu .
Ad funkčnost "$@" -- pokud si odmažeš přepínače z pole, tak v expanzi "$@" ti ale samozřejmě zůstanou.
Ad bez pole: Když bez pole, tak bez pole, tudíž žádné a=, to na začátek. Test jde udělat různě, v bashi můžeš využít něco jako následující:
while [ "$#" -gt 0 ] && [ "${1:0:1}" = "-" ]; do
... tady si nastav proměnné podle celé hodnoty $1 ...
shift
done
Tím ti zmizí parametry začínající pomlčkou a "$@" se expanduje jen na zbylé (tj. požadované názvy souborů). Přesný význam podmínky najdeš pomocí man test (první část) a sekce "Parameter Expansion" z man bash (druhá část). Případně si zkus něco jako x=-r; echo ${x:0:1};
</dev/null cat "$@" | ...
, ale to také záleží na tom, jakou chceš reakci scriptu na prázdný seznam souborů.)
Tohle je už na mě vyšší škola programátorská
Ten while obsahuje ty metody getopts co jsme nechtěli používat ne?
Co myslíš tím řádkem ...tady si nastav proměnné .... To jako ,že uložím první přepínač do jedný proměnný a druhý přepínač do druhý proměnný?
Nebylo by jednoduší pole ikdyž by to byla trochu čuňárna ?
Člověče, to jsou základy! Co dělá while doufám chápeš. Dvě podmínky jsou spojené přes and (&&). První testuje hodnotu proměnné $# (najdi si v man bash, co ta proměnná obsahuje), druhá testuje první znak prvního parametru (detaily opět v manu). Dokud jsou opě splněné volá se shift, který smaže parametr $1 a $2..$n posune o jednu pozici dopředu (detaily viz man).
getopt slouží ke zjednodušení zpracování složitějšího seznamu přepínačů, popravdě využití má spíš v C, v bashi a speciálně pro tenhle případ by ti s getopt vyšel kód spíš složitější.
Nastavit si proměnné: no na základě existence těch přepínačů v parametrech musíš někde dál větvit chování programu, ne? A to větvení je něčím řízeno ( if [ "$raditciselne" = "ano" ]; then ...
), ne? Proměnnou ... ? :)
S polem nic jednoduššího mít nebudeš. To fakt není o tom, že by to byla čuňárna. (Čuňára je volat v cyklu cat
abys tím spojil řadu souborů! Spouštění podprocesu je relativně drahá operace.) Prostě použít pole je v tomhle případě hodně proti logice shellu (shell prostě není Cčko) a z toho plyne, že kód s jeho použitím bude složitější.
Když já už se do toho úplně zamotal While chápu. Proměnné si nastavím , to taky zvládnu ale jak udělat ty přepínače :(
Jinak když to zadám bez přepínáčů tak to snad jede taky ale ještě to musím pořadné otestovat.
#!/bin/bash
a=("$@")
#echo "Parametry: ${a[0]} -- ${a[1]} -- $(a{0]} -- ${a[0]}"
echo "Parametry: ${a[0]} -- ${a[1]} -- ${a[2]} -- ${a[3]} -- ${a[4]} -- ${a[5]}"
while [ "$#" -gt 0 ] && [ "${1:0:1}" = "-" ]; do
"$@"
shift
done
echo "$@"
Tahle syntaxe mi odstraní přepínače ,ale zároveň to hlásí,že příkaz -a nebyl nalezen a to samé pro -r .
Já vím,že už musím vypadat jak idiot, ale Bash je pro mě stále jedna velká záhada.
No, co máš po "do"? Je tam řádek, co začíná "$@", to znamená provede se expanze a první token se vezme jako název příkazu ke spuštění. No a ten první token bude nejprv první parametr, pak druhý, ... Tudíž proto ta chyba. Ty ho ale nechceš spouštět, ne? Chceš jen zjistit, co je obsahem $1. Na to se docela hodí case
. Detaily opět v manuálu. Ukázka:
while ...; do
case "$1" in
-r) echo "zadán přepínač -r"
;;
-a) echo "zadán přepínač -a"
;;
esac
shift
done
Mimochodem, pomocí case se dá také poměrně elegantně vyhnout bash-specific substringové konstrukci ${1:0:1}. Zkus si rozmyslet jak. (Nápověda: case v bashi umí mít label s wildcards). Ale to není nijak podstatné tedka.
Tak jsem se zas o píď pohnul dál
while [ "$#" -gt 0 ] && [ "${1:0:1}" = "-" ]; do
case "$1" in
-r) echo "zadán přepínač -r"
;;
-a) echo "zadán přepínač -a"
;;
-v) echo "5"
exit "0"
;;
esac
shift
done
echo "$@"
TEXT=$TEXT" ""`(cat "$@" | tr '[:upper:]' '[:lower:]')`"
echo $TEXT
SLOVA=`(echo $TEXT | sed 's/[^a-zA-Z]/ /g')`
SLOVA=`(echo $SLOVA | tr '[:space:]' '\n')`
echo $SLOVA
Tohle mi už vypíše všechna slova zadaná ze souborů , nevyhodí to už žádnou chybu. Zpracuje to i soubory co jsou zadané jen jako mezera. Ale zase jsem sekl o kousek dál Tohle mě už fakt zničí
Chci si to uložit do proměnné TEXT a pak upravit na SLOVA, jenže v téhle části se to sekne ikdyž mi to v původním programu funguje.
TEXT a SLOVA jsou po provedení echo úplně totožné. SLOVA by měla být rozsekaná jednotlivá slova na jednotlivé řádky. Ale už se blížím k finále
Můžu ještě rejpat? :)
$(...)
místo `...`
)echo "$TEXT"
(uvozovky), v druhém přiblížení jedna dlouhá pipeline bez meziukládání do proměnných.1. Závorky opraveny, já je tam měl protože, mi to v jedné fázi bez nich nejelo, ale smazáno
2. Pipeline jsem plánoval nějak ukecat a vměstnat do jednoho řádku ,ale zatím jsem se bál
3. Jak to myslíš s tím ukládáním? Nemůžu to uložit nikam do externího souboru
4. Cílem tohoto boje je rozdělit si to na jednotlivá slova na řádek abych pak mohl spočítat jejich četnost, uniq jede po řádcích pokud si to pamatuji dobře.
A teď jeden zvídavej dotaz ode mně (mno teda jeden z mnoha) to Švédsko za jménem znamená, že jsi ze Švédska?
ad 3. No myslím to tak, že až se ti povede vše sepsat do jedné pipeline, tak to prostě rovnou proběhne na výstup a nebude důvod nic ukládat ani do proměnné ani do pomocného souboru. Alespoň pokud mi neuniká nějaký další účel.
ad 4. Jasně, mě šlo o to, jestli v původních vstupních souborech může být víc slov na řádek, která je cílem oddělit. Pokud jo, tak OK. Pokud ne, tak je nahrazování mezer za newline zbytečné a je lépe ty konce řádků rovnou zachovat. Sort, uniq a spol skutečně fungují po řádcích, to máš pravdu.
(Ad Švédsko -- znamená, že jsem ve Švédsku. :) Příp. offtopic k tomu ale kdyžtak přes mail -- klik na profil, poslat mail; ať tu nezaprasujem diskuzi.)
Tiskni
Sdílej: