Snažil som sa vybudovať funkciu, ktorá budedovoľte mi, aby som vykonal dynamické vyhľadávanie grepov - dynamické v tom, že keď je pri volaní funkcie zadaná viac ako jedna premenná, potom prenesie ďalšiu premennú cez grep. Nikdy by som nemal potrebovať viac ako dve premenné, ale zaujímalo by sa aj o to, ako to urobiť.
Príklad požadovanej funkcie:
> function word1 word2
výsledok:
(
cd /path/folder;
less staticfile | grep -i word1 | grep -i --color word2
)
Vyššie uvedené funguje skvele, ak tam budú vždy dve slová. Pokúsim sa naučiť sa používať, ak a potom vyhlásenia, aby som bol flexibilný v počte premenných.
function ()
{
if [ ! "$#" -gt "1" ];
then
(
cd ~/path/folder;
less staticfile | grep -i $1 | grep --color -i $2
)
else
(
cd ~/path/folder;
less staticfile | grep --color $1
)
fi
}
Keď spustím túto funkciu, zdá sa, že robím opak -
> function word1
vráti chybu, pretože z nejakého dôvodu používa príkaz "potom", ale nemôže vložiť do druhého hovoru grep.
> function word1 word2
iba slovo "word1" - preto používa vyhlásenie "else". Čo robím zle? Existuje nejaký jednoduchší spôsob, ako to urobiť?
odpovede:
0 pre odpoveď č. 1Myslím, že to urobí to, čo chceš. Môžete to fungovať. (Všimnite si, že sa používa po zavedení grep.) Tu je kód, po ktorom nasleduje testovací súbor a výstup. (Vezme akýkoľvek počet # args.)
#!/bin/bash
if [[ $# -lt 2 ]]; then
echo -e "nusage: ./prog.sh file grep-string1 grep-string2 grep-string3...n"
echo -e "At least two arguments are required. exiting.n"
exit 5
fi
fname=$1 # always make your file name the first argument
i=2 # initialize the argument counter
cmd="cat $fname"
while [[ $i -le $# ]]; do
cmd=${cmd}" | grep ${!i}"
(( i++ ))
done
eval $cmd
Takže vstupný súbor pre toto môže byť nazvaný tfile s obsahom:
a circuit
pavement
bye
Spustenie kódu funguje takto:
./prog.sh tfile e ye
bye