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... ;-)