Fórum Root.cz
		Hlavní témata => Vývoj => Téma založeno: ZAJDAN  09. 04. 2020, 23:08:25
		
			
			- 
				Ahoj...
 potřeboval bych porovnat zda se hodnota v proměnné, kterou uživatel dosadí pomocí read vyskytuje v poli
 mapfile -t array < /home/brumla/seznam #vznikne pole s čísly řádků
 read -p "zadej číslo řádku" ROW
 if [[ "$ROW" != "${array[@]}" ]]; then
 echo "špatný řádek"
 vůbec mne nenapadá jak v případě proměnné vytvořené přes 'read' vytvořit v následující podmínce cyklus který by ji porovnal vůči array.
 
 díky
- 
				lip popis co presne chces, a pridej vzorovej soubor seznam...
 
 protoze to jak to ted (chapu ze spatne) mas, ti udela to ze kdyz zadas radek c.: 1 porovnava to s "text_prvniho_radku text_druheho_radku atd..."
 
 takze bud chces mit v poli cisla radku a pak neporovnavat cele promene, ale zda se cislo radku vyskytuje nekde v poli,
 nebo chces neco uplne jineho :)
 
- 
				Použij grep nebo databázi. Bude to i rychlejší.
			
- 
				Použij grep nebo databázi. Bude to i rychlejší.
 
 myslis ? ;-)
 echo "prvni druhej treti" | grep 2
 kdyz by mel v poli opravdu cisla radku a ne obsah textu tak staci pro detekci "neobsahuje" takto:
 if [[ ${array[@]} != *$ROW* ]]; then echo "špatný řádek"; fi(tedy $ROW obalit mezi hvezdicky...)
- 
				Použij grep nebo databázi. Bude to i rychlejší.
 
 myslis ? ;-)
 
 
 DB4 mi na notebooku zvládá 200k dotazů za sekundu. Pokud je těch řádek víc než jen pár set, tak je to určitě výhodnější řešení.
 
 Grepem je to také snadné:
 grep '^'"$ROW"'$' </home/brumla/seznam
 V neposlední řadě bych se zamyslel nad tím, jak asi ten soubor vznikl a proč se ten soubor prohledává. Pokud je nutné zabránit nějakým duplicitám, tak se to v databázi dá realizovat mnohem jednodušeji - například v SQLite je vložení i s kontrolou duplicity na jeden řádek.
- 
				Omlouvám se, následně jsem si uvědomil, že array pomocí 'mapfile' není array obsahující počty řádků.
 Vyřešil jsem to tedy takto:
 #spočítej řádky
 rows=$(wc -l /home/brumla/seznam | awk '{ print $1 }')
 
 #vytvoř pole a naplň ho dle spočtených řádků
 declare -a schemas
 for (( i = 1; i <= $rows; ++i )); do
 schemas+=("$i")
 done
 
 read -p "zadej číslo schématu" SCHEMA
 #pokud číslo není ve schématu zvolej Zdar
 if ! [[ ${schemas[*]} =~ "$SCHEMA" ]]; then
 echo "Zdar"
 
- 
				Z vlastní zkušenosti bych doporučil zvážit, zda pro složitější bashovské skripty (např. vyžadující pole) nepoužít python. Obzvláště pokud můžeš použít nějaké IDE s krokováním, výpisem proměnných atd.
			
- 
				...
 
 
 K čemu je tohle vše dobré? Vždyť by to dokázal vyřešit jediný řádek.
- 
				K čemu je tohle vše dobré? Vždyť by to dokázal vyřešit jediný řádek.
 
 1. script spustí SQL příkaz a výstup uloží do souboru:
 dbName
 "DEMOCZ"
 "DEMOEN"
 "DEMOTH"
 3 rows selected (overall time 5219.689 msec; server time 608 usec)
 
2. pomocí 'sed' vyjmu prvni a poslední řadek, smažu všechny uvozovky a zůstane:
 DEMOCZ
 DEMOEN
 DEMOTH
 
Přes mapfile mám pole s názvy selektovaných schémat, které pak dle potřeby dosazuju.
 
 3.uživatel dostane možnost si přes 'read' vybrat DB schema, ale já nechci aby musel zadávat jeho název, proto do výstupu uloženého v souboru vložím čísla řádků
 (awk '{print NR, "\t", $0}'):1 DEMOCZ
 2 DEMOEN
 2 DEMOTH
 
Zde uživatel zadává číslo schématu, proto jsem potřeboval udělat pole s počtem řádků a dle toho si definovat podmínky. Chtěl jsem si to celé udělat v bashi.
- 
				Z vlastní zkušenosti bych doporučil zvážit, zda pro složitější bashovské skripty (např. vyžadující pole) nepoužít python. Obzvláště pokud můžeš použít nějaké IDE s krokováním, výpisem proměnných atd.
 
 
 krokovani v bashi neni problem, existuje bashdb, ale jinak souhlas, s Pythonem nebo Ruby se pracuje lepe
- 
				Ahoj...
 potřeboval bych porovnat zda se hodnota v proměnné, kterou uživatel dosadí pomocí read vyskytuje v poli
 mapfile -t array < /home/brumla/seznam #vznikne pole s čísly řádků
 read -p "zadej číslo řádku" ROW
 if [[ "$ROW" != "${array[@]}" ]]; then
 echo "špatný řádek"
 vůbec mne nenapadá jak v případě proměnné vytvořené přes 'read' vytvořit v následující podmínce cyklus který by ji porovnal vůči array.
 
 díky
 
 Vieš o tom, že môžeš iterovať skrz prvky poľa porovnáť ich s obsahom premennej naplnenej v read?
 Napriklad:
 for i in "${ARR[@]}"; do [[ $VAR =~ $i ]] && echo $i; done
 
- 
				
 Vieš o tom, že môžeš iterovať skrz prvky poľa porovnáť ich s obsahom premennej naplnenej v read?
 Napriklad:
 for i in "${ARR[@]}"; do [[ $VAR =~ $i ]] && echo $i; done
 
 super...tohdle by se mi mohlo hodit abych nemusel manuálně vytvářet podmínky pro proměnnou z 'read', protože pokaždé bude počet prvků v poli jiný
- 
				Zkusil jsem si to bez doplňování čísel do souboru
 #!/bin/bash
 
 mapfile -t array < <(
 echo 'dbName
 "DEMOCZ"
 "DEMOEN"
 "DEMOTH"
 3 rows selected (overall time 5219.689 msec; server time 608 usec)
 ' | sed -ne '/^"/s/"//gp'
 )
 
 read -p "zadej číslo řádku: " ROW
 if [[ -n "${array[$ROW-1]}" ]]; then
 echo "${array[$ROW-1]}"
 fi
 
- 
				Zkusil jsem si to bez doplňování čísel do souboru
 #!/bin/bash
 
 mapfile -t array < <(
 echo 'dbName
 "DEMOCZ"
 "DEMOEN"
 "DEMOTH"
 3 rows selected (overall time 5219.689 msec; server time 608 usec)
 ' | sed -ne '/^"/s/"//gp'
 )
 
 read -p "zadej číslo řádku: " ROW
 if [[ -n "${array[$ROW-1]}" ]]; then
 echo "${array[$ROW-1]}"
 fi
 
 super! moc díky
- 
				[...] Grepem je to také snadné [...]
 
 narazel sem na to, ze bys v textu grepoval cislo, ktere tam proste nebylo... ;-)